在同一上下文中加载两次实体,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.Country
与Condition.Customer.Country
是相同的实体,我得到一个带有消息
InvalidOperationException
。ObjectStateManager中已经存在具有相同key的对象
当我调用
时出现这个异常db.Entry(condition).State = EntityState.Modified;
也Country
实体是不变的,我得到这个异常。
我现在如何存储Condition
实体?
如果你在一个断开连接的上下文中工作,你不能依赖EF TrackChanges机制,并且在图形关系中,你保存的上下文中没有办法知道孩子是否是新的/更新的/没有改变的。当您保存更改时,您将得到您所看到的错误,因为该子实体已经存在,EF正在尝试再次添加它。
Julie Lerman有一个方法,包括管理你自己的修改状态,这样你就可以根据需要正确地附加/分离实体。
这里显示了另一种方法:http://www.entityframeworktutorial.net/EntityFramework4.3/update-one-to-one-entity-using-dbcontext.aspx
这将重新加载你试图保存的子实体(不跟踪),从父实体中删除它,然后允许你将父实体状态标记为"已修改",并重新添加子实体,如果它有一个。