2010-07-08 79 views
3

我的应用程序使用一个存在于应用程序生存期的上下文实例。我使用实体框架来读取和写入所有数据到数据库。添加对象之后,我希望它们被垃圾收集器清理,以便它们不会留在内存中。我已经试过如下:context.detach - 用于垃圾回收

While context.BatchProgresses.Count > 0 
     context.Detach(context.BatchProgresses.First()) 
    End While 

但这是运行到一个无限循环。 Context.Detach()不应该从Context.BatchProgresses中删除项目?

+1

单身上下文是一个非常糟糕的主意,只会在痛苦中结束。上下文是一个工作单元。你的工作单位不是“我应用程序的整个生命周期”。 – 2010-07-09 12:59:34

+1

我很欣赏这个建议。我最终将任务分解成多个上下文。我最初避免了这种策略,因为我担心在定时器循环中创建和销毁上下文的性能影响,但事实证明几乎没有性能影响。 – Terry 2010-07-13 20:30:09

回答

1

像往常一样,在这种情况下,如果你不想重新查询数据库,但附加到上下文实体问题,您可以使用ObjectStateManager:

var attachedEntities = context. 
         ObjectStateManager. 
         GetObjectStateEntries(EntityState.Added | 
              EntityState.Deleted | 
              EntityState.Modified | 
              EntityState.Unchanged). 
         Where(ent => ent.Entity is BatchProgress). 
         Select(ent => ent.Entity as BatchProgress). 
         ToList(); 

foreach (var attachedEntity in attachedEntities) 
{ 
    context.ObjectStateManager.ChangeObjectState(attachedEntity, EntityState.Detached); 
} 

设置ObjectState到EntityState.Detached从集合中删除实体。您可以通过在最后再次提取附件进行检查 - 不会有任何内容。

0

这只是想法,但可能调用BatchProgress.First()会导致数据库读取。确保(通过记录器或SQL分析器)由于该调用而没有执行SQL活动。

你也可以尝试下面的代码(C#)

var list = context.BatchProgress.ToList(); 
foreach(var item in list) 
    context.Detach(item); 
+0

不幸的是context.BatchProgresses.ToList()也会导致数据库查询。 – Yakimych 2010-07-09 08:33:29