C# 分离新创建的对象后实体框架内存泄漏

C# 分离新创建的对象后实体框架内存泄漏,c#,.net,entity-framework,memory-leaks,C#,.net,Entity Framework,Memory Leaks,这里有一个测试: WeakReference ref1; WeakReference ref2; TestRepositoryEntitiesContainer context; int i = 0; using (context = GetContext<TestRepositoryEntitiesContainer>()) { context.ObjectMaterialized += (o, s) => i++; var item = context.S

这里有一个测试:

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);
WeakReference ref1;
参考文献2;
TestRepositoryEntitiesContainer上下文;
int i=0;
使用(context=GetContext())
{
context.ObjectMaterialized+=(o,s)=>i++;
var item=context.SomeEntities.Where(e=>e.somePropertyToLookOn==“some property”).First();
上下文。分离(项目);
ref1=新的WeakReference(项目);
var newItem=newsomeEntity{somePropertyToLookon=“另一个值”};
context.SomeEntities.AddObject(newItem);
ref2=新的WeakReference(新项目);
SaveChanges();
context.SomeEntities.Detach(newItem);
newItem=null;
item=null;
}
上下文=空;
GC.Collect();
Assert.IsFalse(参考文献1.IsAlive);
Assert.IsFalse(参考文献2.IsAlive);
第一个断言通过,第二个断言失败。。。我希望我错过了什么,已经很晚了。。。但是,分离提取的项目实际上会释放对象上的所有句柄,让它被收集。但是,对于新对象,有些东西保留了指针并造成内存泄漏

注意-这是EF4.0

以前有人见过这一点并对此进行过研究吗

谢谢你的帮助


Tom

您是否尝试过在没有附加调试程序的情况下通过优化(即发布模式)运行此程序?JIT编译器可能会人为地延长newItem对象的生存期,直到方法结束


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

您是否尝试过在没有附加调试程序的情况下运行优化(即释放模式)?JIT编译器可能会人为地延长newItem对象的生存期,直到方法结束

我能够在没有优化的情况下重现这个问题,但没有优化