我为在应用程序周期中用作查找的记录创建了一些静态列表。
但是,在内存分析器上检查并看到正在处理对象上下文时,GC无法收集内存,因为它保留在引用中。
以下是代码片段(我认为使用AsNoTracking会破坏上下文和实体之间的关系,并允许上下文片段化。)
private static List<State> _states;
public static List<State> States
{
get
{
if (_states == null)
LoadStates();
return _states;
}
}
private static void LoadStates()
{
using (LeadContextUoW leadContext = new LeadContextUoW())
{
_states = leadContext.States.AllWithNoTracking.ToList();
}
}
请告诉我导致内存泄漏的代码有什么问题。
答案 0 :(得分:0)
您必须明确分离实体。在EF的早期版本中,您可以调用context.Detach - 但我相信这是EF 6中的标准方法。
private static void LoadStates()
{
using (LeadContextUoW leadContext = new LeadContextUoW())
{
_states = leadContext.States.AllWithNoTracking.ToList();
foreach(var state in _states)
leadContext.Entry(state).State = System.Data.Entity.EntityState.Detached;
}
}