在同一上下文中加载两次实体,InvalidOperationException

本文关键字:两次 实体 InvalidOperationException 上下文 加载 | 更新日期: 2023-09-27 17:53:20

我有一个db-first实体框架应用程序和以下关联:

Customer * <-> 1 Country
Machine * <-> 1 Customer
直到现在一切都很好。现在问题来了:
我有另一个类Condition与机器以及客户相关联:
Condition * <-> 1 Customer
Condition * <-> 1 Machine

在一个特殊的实体中,Condition.Machine.Customer.CountryCondition.Customer.Country是相同的实体,我得到一个带有消息

InvalidOperationException

ObjectStateManager中已经存在具有相同key的对象

当我调用

时出现这个异常
db.Entry(condition).State = EntityState.Modified;

Country实体是不变的,我得到这个异常。

我现在如何存储Condition实体?

在同一上下文中加载两次实体,InvalidOperationException

如果你在一个断开连接的上下文中工作,你不能依赖EF TrackChanges机制,并且在图形关系中,你保存的上下文中没有办法知道孩子是否是新的/更新的/没有改变的。当您保存更改时,您将得到您所看到的错误,因为该子实体已经存在,EF正在尝试再次添加它。

Julie Lerman有一个方法,包括管理你自己的修改状态,这样你就可以根据需要正确地附加/分离实体。

这里显示了另一种方法:http://www.entityframeworktutorial.net/EntityFramework4.3/update-one-to-one-entity-using-dbcontext.aspx

这将重新加载你试图保存的子实体(不跟踪),从父实体中删除它,然后允许你将父实体状态标记为"已修改",并重新添加子实体,如果它有一个。