C# 林克';索引超出了数组';问题

C# 林克';索引超出了数组';问题,c#,linq-to-sql,C#,Linq To Sql,在尝试使用C#Linq设置单元测试以将项目插入SQL Server Express(2008)数据库时,我遇到了一个错误,这给我带来了一些麻烦。Linq代码是使用VisualStudio2008构建的 在运行Windows XP SP2的系统上引发异常。Linq工作正常,记录正确插入到运行Windows 7 Home Premium(64位)的系统中 我已经在XP系统上删除并重新创建了数据库。我在XP系统上删除并重新创建了DAL和相应的DBML 对于插入到同一数据库的其他表,使用单元测试可以很好

在尝试使用C#Linq设置单元测试以将项目插入SQL Server Express(2008)数据库时,我遇到了一个错误,这给我带来了一些麻烦。Linq代码是使用VisualStudio2008构建的

在运行Windows XP SP2的系统上引发异常。Linq工作正常,记录正确插入到运行Windows 7 Home Premium(64位)的系统中

我已经在XP系统上删除并重新创建了数据库。我在XP系统上删除并重新创建了DAL和相应的DBML

对于插入到同一数据库的其他表,使用单元测试可以很好地工作

在SQLServerManagementStudio中使用简单的insert语句将记录插入到表中可以正常工作

我应该看什么来找到问题的根源?应该做些什么来解决这个问题

任何关于错误消息真正想说什么的见解都将不胜感激

错误消息

System.IndexOutOfRangeException : Index was outside the bounds of the array.
at 

System.Data.Linq.IdentityManager.StandardIdentityManager.MultiKeyManager`3.TryCreateKeyFromValues(Object[] values, MultiKey`2& k)
at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache`2.Find(Object[] keyValues)
at System.Data.Linq.IdentityManager.StandardIdentityManager.Find(MetaType type, Object[] keyValues)
at System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type, Object[] keyValues)
at System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc, Object instance)
at System.Data.Linq.ChangeProcessor.BuildEdgeMaps()
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges()
at nUnit.DAL.FacilityTests.AddFacility2() in C:\SVN\SVNRevenue360\Branches\Dev\Code\ProviderAdvantage\nUnit.CoreTests\Tests\DAL\FacilityTests.cs:line 50
        [Test]
    public void AddFacility2() {
        string facilityname = "Test Facility";
        try {
            using (PA.Database.Revenue360DB db = new PA.Database.Revenue360DB(PA.DAL.DataAccess.ConnectionString)) {
                db.Log = Console.Out;
                PA.Database.Facility facility = new PA.Database.Facility();
                facility.id = Guid.NewGuid();
                facility.Name = facilityname;
                facility.Street1 = "";
                facility.Street2 = "";
                facility.Street3 = "";
                facility.City = "";
                facility.State = "";
                facility.Zip = "";
                facility.Description = "";

                db.Facilities.InsertOnSubmit(facility);
                db.SubmitChanges();  // line 50
            }
        } catch (Exception ex) {
            Console.WriteLine(ex.GetType().FullName + ":  " + ex.Message);
            Console.WriteLine(ex.InnerException == null ? 
                "No inner exception" :
                ex.InnerException.GetType().FullName + ":  " + ex.InnerException.Message);
            throw;
        }
    }
堆栈跟踪

System.IndexOutOfRangeException : Index was outside the bounds of the array.
at 

System.Data.Linq.IdentityManager.StandardIdentityManager.MultiKeyManager`3.TryCreateKeyFromValues(Object[] values, MultiKey`2& k)
at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache`2.Find(Object[] keyValues)
at System.Data.Linq.IdentityManager.StandardIdentityManager.Find(MetaType type, Object[] keyValues)
at System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type, Object[] keyValues)
at System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc, Object instance)
at System.Data.Linq.ChangeProcessor.BuildEdgeMaps()
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges()
at nUnit.DAL.FacilityTests.AddFacility2() in C:\SVN\SVNRevenue360\Branches\Dev\Code\ProviderAdvantage\nUnit.CoreTests\Tests\DAL\FacilityTests.cs:line 50
        [Test]
    public void AddFacility2() {
        string facilityname = "Test Facility";
        try {
            using (PA.Database.Revenue360DB db = new PA.Database.Revenue360DB(PA.DAL.DataAccess.ConnectionString)) {
                db.Log = Console.Out;
                PA.Database.Facility facility = new PA.Database.Facility();
                facility.id = Guid.NewGuid();
                facility.Name = facilityname;
                facility.Street1 = "";
                facility.Street2 = "";
                facility.Street3 = "";
                facility.City = "";
                facility.State = "";
                facility.Zip = "";
                facility.Description = "";

                db.Facilities.InsertOnSubmit(facility);
                db.SubmitChanges();  // line 50
            }
        } catch (Exception ex) {
            Console.WriteLine(ex.GetType().FullName + ":  " + ex.Message);
            Console.WriteLine(ex.InnerException == null ? 
                "No inner exception" :
                ex.InnerException.GetType().FullName + ":  " + ex.InnerException.Message);
            throw;
        }
    }
插入代码

System.IndexOutOfRangeException : Index was outside the bounds of the array.
at 

System.Data.Linq.IdentityManager.StandardIdentityManager.MultiKeyManager`3.TryCreateKeyFromValues(Object[] values, MultiKey`2& k)
at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache`2.Find(Object[] keyValues)
at System.Data.Linq.IdentityManager.StandardIdentityManager.Find(MetaType type, Object[] keyValues)
at System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type, Object[] keyValues)
at System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc, Object instance)
at System.Data.Linq.ChangeProcessor.BuildEdgeMaps()
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
at System.Data.Linq.DataContext.SubmitChanges()
at nUnit.DAL.FacilityTests.AddFacility2() in C:\SVN\SVNRevenue360\Branches\Dev\Code\ProviderAdvantage\nUnit.CoreTests\Tests\DAL\FacilityTests.cs:line 50
        [Test]
    public void AddFacility2() {
        string facilityname = "Test Facility";
        try {
            using (PA.Database.Revenue360DB db = new PA.Database.Revenue360DB(PA.DAL.DataAccess.ConnectionString)) {
                db.Log = Console.Out;
                PA.Database.Facility facility = new PA.Database.Facility();
                facility.id = Guid.NewGuid();
                facility.Name = facilityname;
                facility.Street1 = "";
                facility.Street2 = "";
                facility.Street3 = "";
                facility.City = "";
                facility.State = "";
                facility.Zip = "";
                facility.Description = "";

                db.Facilities.InsertOnSubmit(facility);
                db.SubmitChanges();  // line 50
            }
        } catch (Exception ex) {
            Console.WriteLine(ex.GetType().FullName + ":  " + ex.Message);
            Console.WriteLine(ex.InnerException == null ? 
                "No inner exception" :
                ex.InnerException.GetType().FullName + ":  " + ex.InnerException.Message);
            throw;
        }
    }
我已经研究了以下问题,但没有深入了解是什么导致了这个问题

看看链接

以下是一些摘录:

此错误的常见原因是 指向错误的联想 方向。(指 如果编辑 手工制作模型,部分原因是 关联箭头指针位于 它将出现的另一端 (在ER图中)

我也有同样的问题 是因为我的主键是 两列而不是传统的 一个。(两个guid)。当我添加一个 第三纵队是唯一的主力 关键栏,它起作用了


更新:做了一些更多的戳周围,发现这样的帖子。看起来它可能与您的DBML有关…

如果代码在一台机器上工作,而在另一台机器上不工作,那么问题应该在外部某处。请检查Windows XP上的.NET Framework版本是否与Windows 7上的相同。其次,如果是XP SP2,那么操作系统可能是原因,因为微软在SP3上做了很多改变。还要检查数据库是否有相同的表。尝试在同一数据库上重现问题,即从Win7进行备份并在XP上恢复(当然,首先备份数据)。还有什么?安全权限和连接字符串可能也会产生影响。

您能指出代码中第50行的位置吗?@Abe Done。这是db.SubmitChanges()调用。@Abe我也查看了这两个链接。DBML看起来是正确的。事实上,它在一台计算机上工作。这个表只有一个字段主键。当你说“它在一台计算机上工作”时,你的意思是你在两个地方运行相同的代码,而只在一个地方得到错误?@Abe是的。相同的代码正在两台不同的计算机上运行。一个作品;另一个没有。我会得到一个diff程序,比较工作目录和非工作目录。在过去,我在csdiff方面运气很好:@Abe-最终,DBML中的一个关系是错误的。剩下的谜团是为什么它最初在某些系统上起作用。它在某些机器上工作的事实导致人们不愿意相信这种关系是错误的。