代码之家  ›  专栏  ›  技术社区  ›  Michael

如何让EF按正确的顺序执行Insert查询?

  •  0
  • Michael  · 技术社区  · 15 年前

    我将实体框架与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 } );
    

    为什么我得到一个UpdateException(“…”中的实体)来参与“BD”关系。找到0个相关的“B”。应为1个“B”)?因为当我省略最后一个命令(插入D,B的子命令)时,它工作得很好,当我随后发出一个insert(即在新事务中)时,它也工作得很好。

    EF是不是在盲目地按随机顺序插入元素,但却注意到这不可能呢?还是我完全错误地对待这个问题?

    更新: 非常抱歉,我们将错误追溯到我犯的一个错误,因此现在错误不会发生在EF级别(除了我上面提到的例外),但是实际上chidl元素的插入被发送到DB,我可以在日志中看到它。因此问题仍然存在,但例外情况不同(外键约束失败)。

    迈克尔

    (编辑以回答评论)

    2 回复  |  直到 15 年前
        1
  •  2
  •   Adam Robinson    15 年前

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

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

    b.Ds.Add(new D());
    
        2
  •  0
  •   Michael    15 年前

    经过几个小时的尝试,我想我已经有了突破。这需要更多的测试,但是我发现EF可以比VARCHAR(n)更好地处理INT关系。我一知道答案就马上更新。

    尽管其他人也在挣扎。。。

    编辑 :是的,当然。对于我的配置(EF1/MySQL),如果父级的主键(子级的外键)是VARCHAR,那么EF会首先插入子级。我试过使用VARCHAR(120)和VARCHAR(255),但都没用。