【问题标题】:Entity Framework foreign key issues when inserting multiple records?插入多条记录时的实体框架外键问题?
【发布时间】:2011-12-14 14:17:32
【问题描述】:

我们遇到了一个问题,当我们提交要添加到数据库的多个对象的列表时,我们会收到与外键相关的错误...

using (context ctx = new context()
{
    foreach(foo f in bars)
    {
         ctx.AddToFoo(f);
    }
    ctx.SaveChanges();
}

错误表明插入语句与外键约束冲突,但如果我将 SaveChanges() 移动到 foreach 循环内,它可以正常工作,但似乎会慢得多...

我会将它加入 BulkCopy 类,但我们有一堆与 SaveChanges 相关的日志记录代码。

编辑: 这是异常图片的链接Linky

【问题讨论】:

  • 愿意分享错误信息吗?也可能值得启动 SQL Profiler 或 EFProf 来查看正在发出的实际 SQL,这样您就可以查看它是否试图以错误的顺序执行任何操作。
  • 我只有一个打印出来的,所以我试图获取上传异常的图片...
  • 好的,这个Link To Pic
  • Foo 上面有外键吗?完整的异常消息是什么?我问是因为通常引用外键约束的名称(例如约束“FK_Teacher_Class”)
  • 是的,上面有外键,完整的例外情况见上图

标签: c# .net entity-framework exception entity-framework-4


【解决方案1】:

看起来SaveChanges 保存每个 foo 的顺序与它们在 AddToFoo 中添加的顺序不同。

【讨论】:

  • 每个 foo 都与其他外键无关,所以不应该这样。
【解决方案2】:

我不知道为什么它会在 for 循环中工作。如果循环外有异常,那么它也应该在里面给出异常。

您应该对异常中列出的外键约束进行故障排除。因此,如果约束是“FK_Foo_Parent”,那么您首先需要有一个父项,该 Foo 项引用。

您的代码应如下所示:

                using (context ctx = new context())
                {
                    ctx.AddToParents(parent);

                    foreach (foo f in bars)
                    {
                        parent.Foos.Add(f);
                        ctx.AddToFoos(f);
                    }
                    ctx.SaveChanges();
                }

这将在新的 foo 记录和它的父记录之间设置外键引用。

【讨论】:

  • 我在想这可能与在调用 SaveChanges 之前添加太多对象有关,但我想我必须看看它生成的 SQL,因为外键应该都可以那一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多