2010-06-07 70 views
1

這裏後,實體框架內存泄漏是一個測試:分離新創建的對象

WeakReference ref1; 
WeakReference ref2; 

TestRepositoryEntitiesContainer context; 
int i = 0; 
using (context = GetContext<TestRepositoryEntitiesContainer>()) 
{ 
    context.ObjectMaterialized += (o, s) => i++; 
    var item = context.SomeEntities.Where(e => e.SomePropertyToLookupOn == "some property").First(); 
    context.Detach(item); 
    ref1 = new WeakReference(item); 
    var newItem = new SomeEntity {SomePropertyToLookupOn = "another value"}; 
    context.SomeEntities.AddObject(newItem); 
    ref2 = new WeakReference(newItem); 
    context.SaveChanges(); 
    context.SomeEntities.Detach(newItem); 

    newItem = null; 
    item = null;  
} 
context = null; 

GC.Collect(); 
Assert.IsFalse(ref1.IsAlive); 
Assert.IsFalse(ref2.IsAlive); 

首先斷言通過,第二次失敗......我希望我失去了一些東西,它是晚...但看來,分離獲取的項目實際上會釋放該對象的所有句柄以使其被收集。但是,對於新的對象來說,某些東西會保持一個指針並且會產生內存泄漏。

NB - 這是EF 4.0

任何人之前看到過這個和解決它嗎?

感謝您的幫助!

湯姆

回答

1

你嘗試與優化(即發佈模式),並沒有一個調試器附加運行呢? JIT編譯器可能會人爲地延長newItem對象的生命週期直到方法結束。

我能夠在沒有優化運行的情況下重現問題,但不能優化。