实体在相同的Context中加载了两次,InvalidOperationException

时间:2014-03-25 14:10:37

标签: c# entity-framework

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

Customer * <-> 1 Country
Machine * <-> 1 Customer

到目前为止,一切都很好。现在问题是:
我有另一个与机器和客户相关联的课程Condition

Condition * <-> 1 Customer
Condition * <-> 1 Machine

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

  

ObjectStateManager

中已存在具有相同键的对象

当我致电

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

同样,Country Entites不变,我得到了这个例外。

我现在如何存储Condition实体?

1 个答案:

答案 0 :(得分:0)

如果您在断开连接的上下文中工作,则不能依赖EF TrackChanges机制,并且通过图形关系,您保存的上下文无法知道子项是新的/更新/不更改。 当您保存更改时,您将收到您看到的错误,因为该子实体已经存在且EF正在尝试再次添加它。

Julie Lerman有一个方法涉及管理您自己的修改状态,以便您可以根据需要正确地附加/分离实体。

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

这将重新加载您要保存的子实体(不跟踪),将其从父项中删除,然后允许您将父项的实体状态标记为“已修改”,并重新添加该子项(如果有)。 / p>