【问题标题】:How to make EF execute Insert Queries in the right order?如何让 EF 以正确的顺序执行插入查询?
【发布时间】:2010-08-23 12:23:58
【问题描述】:

我将实体框架与 MySQL 服务器一起使用,因为我希望能够再次对我的 MySQL 数据库进行良好而简单的 LINQ 查询。 我有一个非常简单的问题,我很沮丧,因为我不敢相信 EF 犯了这么可怕的错误。

为了简化,我有父类和子类,我想在一个事务中执行两个插入。

演示:我有 A、B、C 和 D。 A 是 B 和 C 的父母,B 和 C 是 D 的父母(必须是这样)。

我执行以下操作:

B b = new B() { B_ID = 1 };
A.Bs.Add(b);
C.Ds.Add(new D() { B_ID = b.B_ID } );

我这样做是因为所有这些实际上都发生在 C 类中。 为什么我会收到 UpdateException(“...”中的实体参与“BD”关系。找到了 0 个相关的“B”。需要 1 个“B”)?因为当我省略最后一个命令(插入 D,B 的子级)时,它可以正常工作,而当我随后发出插入(即在新事务中)时,它也可以正常工作。

难道是 EF 盲目地以随机顺序插入元素,但自己注意到它不可能吗?还是我以完全错误的方式处理问题?

EF 版本:我有 .NET FX 3.5 SP1,所以据我所知是版本 1。

更新: 非常抱歉,将错误追踪到我犯的错误,所以现在错误不会发生在 EF 级别(我上面说的例外),但实际上是一个 INSERT因为 chidl 元素被发送到数据库,我可以在日志中看到它。所以问题依然存在,只是异常不同(外键约束失败)。

感谢您的帮助, 迈克尔

(编辑回答 cmets)

【问题讨论】:

  • 正如我现在发布的,我认为它是第 1 版。

标签: c# sql mysql entity-framework


【解决方案1】:

b.B_ID 是否代表身份列(或由数据库自动生成的其他 ID)?如果是这样,那么在它的插入操作发生之前它不会有一个可用的值。在这种情况下,您必须使用对象引用而不是数据库标识符来设置关系的一侧。

要么:

C.Ds.Add(new D() { B = b });

或者

b.Ds.Add(new D());

【讨论】:

  • b.B_ID是key列,但是值是可以使用的,因为我其实是在构建B之后设置的(是"..."党,要改原帖了,不好意思)
  • @Michael:您尝试过我提出的建议之一吗?我并不是说您的方式不应该工作,但我很好奇其中一个选项是否允许您将它们插入同一批次。
  • @Adam:是的,它帮助我发现我在周围的代码中犯了一些非常类似于初学者的错误,所以非常感谢你的那些:-) 但现在我仍然卡住了插入顺序错误!
  • @Michael:所以,为了确认一下,如果您使用对象引用,它可以正常工作,但当您使用显式 ID 时就不行,对吗?
  • 不,不幸的是它也不能很好地处理对象引用。当然,当我尝试创建一个新项目时,恰好是这 4 个表(A、B、C、D)的一个孤立示例来重现问题,这一切都突然起作用了 :-(
【解决方案2】:

经过几个小时的尝试,我想我已经取得了突破。这需要更多测试,但我发现 EF 可以比 VARCHAR(n) 更好地处理 INT 关系。我会尽快更新这个答案。

尽管其他人也会苦苦挣扎......

编辑:是的,当然。对于我的配置(EF1/MySQL),如果父项的主键(以及子项的外键)是 VARCHAR,则 EF 将子插入放在首位。我用 VARCHAR(120) 和 VARCHAR(255) 试过了,都没有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多