这是一个测试:
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);
第一个断言传递,第二个失败...我希望我遗漏了一些东西,它已经晚了......但是看起来分离一个取出的项目实际上会释放对象的所有句柄让它被收集。但是,对于新对象,某些东西会保留指针并造成内存泄漏。
注意 - 这是EF 4.0
之前有人见过这个并在其周围工作过吗?
感谢您的帮助!
汤姆
答案 0 :(得分:1)
您是否尝试使用优化(即发布模式)并且未附加调试器来运行此操作? JIT编译器可能会人为地延长newItem对象的生命周期,直到方法结束。
我能够在没有优化的情况下重现问题,但不能通过优化来重现。