我正在使用带有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元素发送到DB,我可以在日志中看到它。所以问题仍然存在,但异常是不同的(外键约束失败)。
感谢您的帮助, 迈克尔
(编辑回答评论)
答案 0 :(得分:2)
b.B_ID
是否表示标识列(或由数据库自动生成的其他ID)?如果是这样,那么在插入操作发生之前它将没有可用的值。在这种情况下,您必须使用对象引用而不是数据库标识符来设置关系的一侧。
或者:
C.Ds.Add(new D() { B = b });
或者
b.Ds.Add(new D());
答案 1 :(得分:0)
经过几个小时的尝试,我想我已经取得了突破。这需要更多的测试,但我发现EF可以比VARCHAR(n)更好地处理INT关系。我知道后立即更新这个答案。
虽然其他人也会挣扎......
编辑:肯定,是的。对于我的配置(EF1 / MySQL),如果父级的主键(和子级的外键)是VARCHAR,则EF会将child-INSERT放在第一位。我尝试使用VARCHAR(120)和VARCHAR(255),没有用。