Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在同一上下文中加载了两次实体,InvalidOperationException_C#_Entity Framework - Fatal编程技术网

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

C# 在同一上下文中加载了两次实体,InvalidOperationException,c#,entity-framework,C#,Entity Framework,我有一个db first Entity Framework应用程序和以下关联: Customer * <-> 1 Country Machine * <-> 1 Customer 在一个特殊实体中,Condition.Machine.Customer.Country与Condition.Customer.Country是同一实体,我收到一个带有消息的InvalidOperationException ObjectStateManager中已存在具有相同密钥的对象 此异常

我有一个db first Entity Framework应用程序和以下关联:

Customer * <-> 1 Country
Machine * <-> 1 Customer
在一个特殊实体中,Condition.Machine.Customer.Country与Condition.Customer.Country是同一实体,我收到一个带有消息的InvalidOperationException

ObjectStateManager中已存在具有相同密钥的对象

此异常在我调用时出现

db.Entry(condition).State = EntityState.Modified;
此外,国家实体不变,我得到这个例外


现在如何存储条件实体?

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

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

另一种方法如下所示:


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

这是在断开连接的上下文中吗?i、 e.上下文只存在于查询中,并且被释放,当调用save changes时,将创建一个新上下文??它是一个WCF,每次调用数据库时都会创建一个新上下文。它也适用于所有其他对象,但在这个特殊情况下,我有两个相同的国家实体,我得到了这个例外。因此,上下文没有问题。我不是说这是上下文的问题,而是说如何使用上下文对保存更改很重要。我想,数据库中可能存在循环设计问题。我建议您检查@serhads我已经检查过了,没有循环国家实体的状态没有改变,而且EntityState.Modified与EntityState.Added有所不同。使用EntityState。修改后,不会像您提到的那样再次添加任何内容。您在更改状态时检查过国家状态吗?还有一件事:您提到了Julie Lerman。在回答这个问题时,她还提到子对象被标记为未更改:。因此,您的答案是错误的,将父项设置为“已修改”也会将子项设置为“已修改”!听着,我只是想帮你。您以前在尝试保存断开连接的图形时没有遇到过这些问题:它们很复杂,并且您不是唯一遇到问题的人。我给你指的是正确的方向。如果你愿意,你可以挑剔我的措辞,但这不能解决你的问题。EF正在尝试插入您的子项,因为它无法跟踪其状态,并且不知道它不是新实体。这导致了你的错误。这就是您需要解决的问题,有几种方法可以解决。另一种解决方案,类似于Julies自定义状态接口,这样您的实体就可以跟踪它们自己的状态:然后在服务器上,您可以检查它,以确定图形部分应该具有哪些实体状态。
db.Entry(condition).State = EntityState.Modified;