C# 从所有打开的上下文中分离实体

C# 从所有打开的上下文中分离实体,c#,entity-framework,entity-framework-6,dbcontext,C#,Entity Framework,Entity Framework 6,Dbcontext,在线程1中,我有: MyDbContext contextInstance1 = new MyDbContext(); var entity = contextInstance1.EntityDbSet.First(); // Some work with the entity goes here.... 在线程2中: //The entity is passed as an argument from thread 1 contextInstance2.EntityDbSet.Attach(

在线程1中,我有:

MyDbContext contextInstance1 = new MyDbContext();
var entity = contextInstance1.EntityDbSet.First();
// Some work with the entity goes here....
在线程2中:

//The entity is passed as an argument from thread 1
contextInstance2.EntityDbSet.Attach(entity);
contextInstance2.EntityDbSet.Remove(entity);
我得到以下错误:

实体对象不能由的多个实例引用 IEntityChangeTracker

如果删除Attach()行,则会出现一个错误,表示在第一次附加之前无法删除该实体

我明白我必须做什么,但我不知道在这种情况下该怎么做。我的问题是我在thread2中没有引用(也不知道)contextInstance1


因此,我正在寻找一种方法,在将对象附加到另一个上下文之前,将对象从第一个上下文中分离出来。如果EF知道上下文的另一个实例存在,那么应该有一种方法来访问它,这就是我想要的。

在将实体传递给contextInstance2之前,您可以尝试分离contextInstance1中的实体,如下所示:

MyDbContext contextInstance1 = new MyDbContext();
var entity = contextInstance1.EntityDbSet.First();
// Some work with the entity goes here....
contextInstance1.Entry(entity).State = EntityState.Detached;

这将有助于我希望线程不会并行运行?为什么?=/他们可能会这样。我已经能够用这个问题解决我的问题:方法略有不同:这里我们从实体中获取contextInstance1,而不是创建另一个。感谢这一点,我可以直接从上下文中删除实体。我不确定是否有必要按照@GertArnold commentI的要求对上下文进行“锁定”,因为很难让两个上下文对同一个对象执行操作,不知道其中一个何时可以分离它。特别是,如果两个线程都需要更新实体,这看起来很麻烦。我不能这样做,DDD,域模型是持久性无知的;)调用方位于域模型中。