如何替换objectstatemanager正在跟踪的实体

时间:2013-07-21 17:07:34

标签: c# entity-framework objectcontext

在尝试附加实体时,我在更新尝试时收到“具有相同密钥的对象已存在”。启用了懒惰加载。 我用Google搜索,发现没有真正解决这个问题的方法。我最好的解决方案是替换对象状态管理器中的条目,但我找不到任何地方如何替换它。它有可能吗?

当我在一个上下文中创建对象A的实例(具有对象B的集合)而在另一个上下文中创建B对象时,会出现问题。当我试图连接它们时它会断裂。 有没有办法告诉EF何时替换它正在跟踪的条目。当我将重复的entitykey条目对象状态设置为修改时,它是否可能允许替换。

1 个答案:

答案 0 :(得分:3)

您的问题有两个部分。

<强> 1。检测实体是否已被上下文跟踪。

如果您对同一个实体实例有两个引用,则很容易看出它是否被跟踪。

Boolean isTracked = context.MyEntities.Local.Contains(myEntity);

如果您有一个实体的两个实例在概念上相同,因为它们具有相同的密钥,那么事情可能会更加困难。

Boolean isTracked = context.MyEntities.Local.Any(x=>x.Id == myEntity.Id);

或者使用EqualityComparer<T>

public class MyEntityEqualityComparer : EqualityComparer<MyEntity>
{
   public override bool Equals(MyEntity x, MyEntity y)
   {
      return x.Id == y.Id;
   }

   public override int GetHashCode(MyEntity obj)
   {
      return obj.Id;
   }
}

context.MyEntities.Local.Contains(myEntity, new MyEntityEqualityComparer());

<强> 2。关闭被跟踪的实体。

这可以这样实现:

context.Entry<MyEntity>(entityToReplace).State = EntityState.Detached;
context.MyEntities.Attach(entityToAdd);

但是,在您完成所有这些之前,您应该查看您的应用程序设计。必须在上下文之间处理实体可能表明您没有将任务分组到可以在单个上下文中操作的适当工作单元。