最近发现在entity framework中出现内存泄漏的问题。实体对象总是包含着ObjectContext的引用,即便在ObjectContext已经被Dispose的情况下。
通常我们都会使用“using”语句或者手动调用obj.dispose()来销毁ObjectContext。我希望在销毁该对象后,对应的内存空间会被回收。但实际我通过.net memory profiler查看内存对象的时候发现ObjectContext并没有被回收,上面提示“对象已经销毁但没有被垃圾回收”。原因是我需要将实体对象“user”存在session中(在session的有效期内,user对象不会被回收),而"user"包含了对"ObjectContext"的引用。
Users user = null;
using (B2CEntities context = new B2CEntities()){user = context.Users.First();}Session.Add(user.OID.ToString(), user);
user对象查出来后默认的状态是“Unchanged”,我发现如果手动调用context.detach(user), user的状态变为“Detached”,就不会引用context,也就不会产生内存泄漏的问题。然而这样会产生另外一个问题,detach后user中所有导航属性都会变成“Unload”。无疑这不是可行的方法。
不清楚这是否entity framework的Bug,各位大牛有何建议?
在msdn上也发了贴,请参考这里http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/eace1b85-a15b-48cc-aaa4-17cf85f1111c
Entity Framework的版本是多少?Users是POCO吗?