如果AutoDetectChangesEnabled设置为false,则实体框架更新外键抛出异常

时间:2014-03-22 10:37:37

标签: entity-framework

我有表A和表B. 一个像:id          名称          出价 B喜欢:id          型

表A中的

有B1的数据记录引用,现在我想用B2更新A引用。 在我的单元工作中如果我设置AutoDetectChangesEnabled = true它的工作正常,但我设置AutoDetectChangesEnabled = false原因是我想提高速度抛出这样的异常: 已成功提交对数据库的更改,但更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:发生了引用完整性约束违规:关系一端的“GoodsKind.goods_kind_id”的属性值与另一端的“EnrolmentType.goods_kind”的属性值不匹配。

我怎么做?

2 个答案:

答案 0 :(得分:0)

我也遇到了这个错误。对我来说问题是我有一个复杂的类型。当我更改主记录(让我们说Person)时,我也想用他的联系信息更改复杂类型List。所以,当我试图在一个屏幕上保存它们时,我收到了这个错误。检查是否在屏幕上填写主记录和复杂类型记录的所有ID。检查它们是否已发布到服务器(如果您在示例MVC中使用)。您可以通过检查MVC操作的Bind语句来执行此操作。

答案 1 :(得分:0)

错误表明ID和指定的对象不匹配。这意味着你说A有一个ID = 2的B,但同时你有一个B,对象是B = ID为5的对象。因为您在断开连接的环境中工作,所以EF并不知道哪一个是正确的。要解决此问题,您可以执行以下操作之一: - 从EF获取对象,修改它然后保存(连接环境)。 要么 - 手动更新ID(更新A设置ID = 5,因为对象B的ID = 5)。

请务必记住,如果EF处于连接环境中且已启用跟踪,则会跟踪更改。如果没有,它就不会知道您所做的更改,直到它尝试将其保存在DB中(其中将对象与DB中的值进行比较)。您可以做的一件事就是手动告诉EF在断开连接的环境中修改了实体:

dbContext.Entry(objectA).State = EntityState.Modified;