【问题标题】:entity framework update foreign key throws exception if AutoDetectChangesEnabled set false如果 AutoDetectChangesEnabled 设置为 false,则实体框架更新外键会引发异常
【发布时间】:2014-03-22 10:37:37
【问题描述】:

我有桌子 A 和 B 点赞:id 姓名 出价 B 喜欢 : id 输入

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

我该怎么办?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-07-10
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        • 2015-12-20
        • 1970-01-01
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多