【问题标题】:Memory leak on entity framework实体框架上的内存泄漏
【发布时间】:2014-09-26 22:35:15
【问题描述】:

我为在应用程序周期中用作查找的记录创建了一些静态列表。

但是,当在内存分析器上检查并看到对象上下文正在被释放时,GC 无法收集内存,因为它保留在引用中。

下面是代码 sn-p(我认为使用 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();
                }
            }

请让我知道导致内存泄漏的代码有什么问题。

【问题讨论】:

  • AllWithNoTracking 与 IQueryable 上的 AsNoTracking 扩展不同,不是标准的 EF 扩展。您是否有权访问自定义扩展的源代码以确保其正确实施?
  • 正确实现。以下是定义: public IQueryable AllWithNoTracking { get { return DbSet.AsNoTracking().AsQueryable(); } }

标签: c# entity-framework memory-leaks


【解决方案1】:

您必须明确分离实体。在早期版本的 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;
            }
        }

【讨论】:

  • 这应该不是必需的,因为 IQueryable 的 AsNoTracking 扩展将阻止返回的对象被上下文缓存。
  • 我同意 Rob 的观点。如果我需要为此类实例分离实体,AsNoTrackign 有什么用?
  • 我相信 AsNoTracking 仍然为了延迟加载而附加实体。跟踪并不是将实体附加到上下文的唯一原因。如此处所述:stackoverflow.com/questions/5599147/…AsNoTracking 并未完全分离实体。
  • 迈克我认为你可能是对的。作为确认,我进行了调试,当使用 AsNoTracking 时,实体状态我看到它未更改而不是分离。我将编写一个通用解决方案,在处理所有实体之前将其从上下文中分离出来。我会及时通知你们结果。
  • 分离实体对我来说不是很有用,因为它失去了所有的导航属性,即使它们是在处理上下文和从上下文中分离实体之前加载的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2016-06-16
相关资源
最近更新 更多