【问题标题】:Linq 'Index was outside the bounds of the array' problemLinq'索引超出数组范围'问题
【发布时间】:2011-04-13 22:01:15
【问题描述】:

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

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

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

其他对同一数据库进行单元测试的表也可以正常工作。

在 SQL Server Management Studio 中使用简单的插入语句将记录插入表中可以正常工作。

我应该看什么才能找到问题的根源?应该怎么做才能解决问题?

我们将不胜感激任何关于错误消息真正想要表达的见解。

错误信息

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;
        }
    }

我查看了以下 SO 问题,但没有深入了解导致此特定问题的原因。

https://stackoverflow.com/questions/1087172/why-am-i-getting-index-was-outside-the-bounds-of-the-array IndexOutOfRangeException on Queryable.Single Strange LINQ Exception (Index out of bounds)

【问题讨论】:

  • 您能否指出代码中第 50 行的位置?
  • @Abe 完成。这是 db.SubmitChanges() 调用。

标签: c# linq-to-sql


【解决方案1】:

看看this链接。

以下是一些摘录:

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

我也遇到了同样的问题 是因为我的主键是 两列而不是传统的 一。 (两个向导)。当我添加一个 第三列是唯一的主要列 关键列,它起作用了。

更新:做了更多的探索,发现this SO 帖子。看起来这可能与您的 DBML 有关...

【讨论】:

  • @Abe 我也查看了这两个链接。 DBML 看起来是正确的。事实上,它可以在一台计算机上运行。有问题的表只有一个字段主键。
  • 当您说“它可以在一台计算机上运行”时,您的意思是您在两个地方运行相同的代码并且只在一个地方出现错误?
  • @Abe 是的。相同的代码正在两台不同的计算机上运行。一个作品;另一个没有。
  • 我会得到一个差异程序并将工作目录与非工作目录进行比较。过去我在 csdiff 上很幸运:componentsoftware.com/Products/csdiff
  • @Abe - DBML 中的最终关系之一是错误的。剩下的谜团是为什么它首先在某些系统上起作用。它在某些机器上运行的事实导致人们不愿意相信这种关系是错误的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多