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对象的生存期,直到方法结束 我能够在没有优化的情况下重现这个问题,但没有优化