2010-07-08 83 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