c# - 使用 Entity Framework 时发生内存泄漏

标签 c# entity-framework

我有一个使用EF的非常简单的应用程序。但是当它运行一周时,内存使用情况非常糟糕(最初只有80MB,一个星期后只有700MB)。
当我使用dotMemory来分析我的应用程序时。我发现第2代堆的内存一直在增加。

我得到一个快照,最后发现ef dbcontext的保留字节最多。

我感到很困惑。我的申请非常简单。代码示例:

protected CarbonBrushMonitorEntities _entities = new MYEntities();
public void Add(HistoryData data)
{
   _entities.HistoryDatas.Add(data);
   _entities.SaveChanges();
}  
_entities在开始时仅缩写一次,然后一直使用。

经常调用Add函数,大约3次/秒

我在Google上搜索了很长时间,然后尝试一些方法,例如:
_entities.Configuration.ValidateOnSaveEnabled = false;
_entities.Configuration.AutoDetectChangesEnabled = false;
_entities.Configuration.LazyLoadingEnabled = false;

但是这些不起作用。

最佳答案

如果使用 Entity Framework ,则应在需要之前创建上下文尽快将其处置:

 using (var someContext = new SomeContext())
 {
    // your commands/queries
 }

切勿将上下文保留在内存中或在不同的调用之间共享。

我通常要做的是向IoC容器注册上下文:
 DependencyFactory.RegisterType(typeof(SomeContext));

并使用上下文解析器(当然也已向IoC注册):
 using (var someContext = _contextResolver.ResolveContext())
 {
     // your commands/queries
 }    

解决方法如下:
 public class ContextResolver : IContextResolver
 {
     public ISomeContext ResolveContext()
     {
          return DependencyFactory.Resolve<SomeContext>();
     }
 }

EF上下文实际上是您的工作单元,一旦您不再需要它,就应该将其丢弃。

关于c# - 使用 Entity Framework 时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30209528/

相关文章:

c# - ClaimsPrincipal.Current.FindFirst 尝试创建一个 sql 数据库

c# - 如何在 MVVM 中处理 `ScrollViewer.ScrollChanged` 事件?

c# - 随机获取 ExecuteNonQuery 需要打开且可用的连接

c# - 如何从 C# 中的 PowerShell 命令获取 Invoke-Command 详细或调试输出

c# - '/' 应用程序中的服务器错误

c# - 哪里的条件可以是 EF 中的列表?

c# - Entity Framework 日期组合查询

c# - 在构建发布 exe 之前是否需要删除断点?

entity-framework - 使用 EF Code First 的 SQL Server View 与 LINQ to entity 查询

entity-framework - Entity Framework 、SQL Server CE 4.0 和 Code First 的启动性能问题