Entity framework 实体框架:分离但保留对象图

Entity framework 实体框架:分离但保留对象图,entity-framework,dispose,detach,Entity Framework,Dispose,Detach,我在一个断开连接的场景中工作,但我注意到处理对象上下文并不会释放附加的实体。因此,后续操作往往会因此而失败 为了解决这个问题,我自己在处理对象上下文时分离所有内容: public void Dispose() { // detaching is not really needed, because we have short living object contexts var objectStateEntries = _context.UnderlyingConte

我在一个断开连接的场景中工作,但我注意到处理对象上下文并不会释放附加的实体。因此,后续操作往往会因此而失败

为了解决这个问题,我自己在处理对象上下文时分离所有内容:

public void Dispose()
{
   // detaching is not really needed, because we have short living object contexts
   var objectStateEntries = 
       _context.UnderlyingContext.ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged);           
   objectStateEntries.ToList().ForEach(o => { if (o.Entity != null)
   {                
     _context.UnderlyingContext.Detach(o.Entity);               
   }});            

   _context.Dispose();
   _context = null;    
}
然而,副作用是对象图完全分离,但我真的想保留该图


似乎我没有找到解决办法,这是真的,它不能做吗?

我们也有这个问题;不能将图形的一部分附加到EF上下文。您是否考虑过在初始状态下加载数据?然后,上下文被用作无状态的数据存储库,而不是其他任何东西

您可以按以下方式加载最初已删除的数据:

myDataContext.MyEntitySet.MergeOption = MergeOption.NoTracking;

你能更好地解释这个问题吗?在我看来,这一切都不必要。“未发布”实体是如何导致问题的?好吧,假设我在断开连接的客户端中创建了一个复杂的实体,将其发送到使用实体框架创建该实体的后端。这将起作用,更新的实体将被发送回断开连接的客户端。然后,客户机更新实体,更改某些属性,可能向集合添加和删除实体。回到后端,我然后重新附加所需的内容,但我经常会得到一个错误,即实体已经附加。但是如果我尝试使用TryGetObjectStateEntry检查这个,它也会抛出一个异常,告诉我它不在上下文中!(tbc)因此,似乎存在冲突,因为我试图使用仍然附加到先前对象上下文的实体。如果在处理第一个上下文时首先分离此实体,则不会有任何问题。因此,我得出结论,如果一个实体要在另一个上下文中使用,它应该总是被分离。是吗?我用这个代码修复了一个内存泄漏。实体框架实体上下文在dispose上清除其内部缓存。如果上下文中的实体图足够大,垃圾收集器可能不会收集内存,从而导致内存泄漏。在处置上下文时分离/分离缓存实体修复了这个问题。