2010-06-07 27 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对象的生命周期直到方法结束。

我能够在没有优化运行的情况下重现问题,但不能优化。