无法附加分离的实体:“ObjectStateManager 中已存在具有相同键的对象”

Posted

技术标签:

【中文标题】无法附加分离的实体:“ObjectStateManager 中已存在具有相同键的对象”【英文标题】:Unable to attach a detached entity: "An object with the same key already exists in the ObjectStateManager" 【发布时间】:2009-07-15 14:34:04 【问题描述】:

我正在尝试将实体附加到 ObjectContext。 当我这样做时,会抛出以下 InvalidOperationException:

An object with the same key already exists in the ObjectStateManager.
The ObjectStateManager cannot track multiple objects with the same key.

我在对象状态管理器中检查,该项目不存在:

//Data context is actually the object context.
ObjectStateEntry contact;
while ( //Should only work once since it should be true if the item was attached
          !DataContext.ObjectStateManager.
          TryGetObjectStateEntry(Contact, out contact)
      )
      DataContext.Attach(Contact); //Here is the exception thrown.

或者看看这个抽象的例子,告诉我它是否有意义:

EntityState state = Contact.EntityState; //Detached

DataContext.Attach(Contact); //Throws the exception.
DataContext.AttachTo("Entities.Contacts", Contact); //Throws the Exception

var detached = DataContext.ObjectStateManager.
                   GetObjectStateEntries(EntityState.Detached);
//InvalidArgumentException - detached entities cannot be in the obj state mgr

也欢迎用VB回答。

【问题讨论】:

【参考方案1】:

您的联系人实体是否有两个具有相同EntityKey 的子实体?例如,是否可以从 Contact 实体获取具有相同 key 的两个 Address 实体?

如果您指定MergeOptions.NoTracking,上下文将愉快地返回一个分离的对象图,其中包含具有相同键的实体。但是,当您附加相同的对象图时,将抛出 System.InvalidOperationException。

我建议您查看要附加到上下文的整个对象图,并检查其中是否存在具有重复键的对象。

【讨论】:

我面临着类似的问题,您能否举例说明您将如何查看附加到上下文的整个对象图并检查其中是否存在具有重复键的对象?【参考方案2】:

答案是(我没有提到这是问题所在,因为我不知道它是),如果您将导航属性设置为跟踪实体,新实体会自动添加:

Dim s = context.States.FirstOrDefault()
Dim a As New Address
a.State = s

Dim state = a.EntityState '= Added

因为我不知道我一直想知道实体是如何被跟踪的。 我会删除整个问题,但由于其他答案的努力可能会有所帮助,我将把它留在这里,如果您认为应该关闭它,请投票关闭。

【讨论】:

相关:***.com/questions/8759699/…【参考方案3】:

我在我的应用程序中遇到了同样的问题。

我已经使用ObjectStateManager TryGetObjectStateEntry Method解决了这个问题

事实上,EntityState 属性会误导开发人员。虽然它显示的是 Detached,但有趣的是会导致错误。

【讨论】:

【参考方案4】:

检查您是否正在设置 Entity 对象的 EntityKey 属性。如果您正在设置它,请确保您不是从现有实体对象复制。

【讨论】:

以上是关于无法附加分离的实体:“ObjectStateManager 中已存在具有相同键的对象”的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 - 分离和重新附加实体?

Spring JpaRepository - 分离和附加实体

实体框架:使用分离的对象和附加的对象

用于附加/分离组件的aframe-state组件

实体框架代码优先 - DbContext 上没有 Detach() 方法

使用相同的键附加分离的条目