【问题标题】:dbcontext.SaveChanges() memory exception in large records EF大记录 EF 中的 dbcontext.SaveChanges() 内存异常
【发布时间】:2020-11-01 04:52:49
【问题描述】:

我在执行 decontext.savechanges() 方法时遇到内存不足异常。

实际上我需要在一些表中插入/更新 10000+ 条记录。

//insert table 1 // 10000 record <br>
//insert or update record to table 2 //25000 record<br>
//table 3 1000 record<br>

....
.....
.....

db.context.savechanges(); //Exception happening in this line.

我收到“抛出了‘System.OutOfMemoryException’类型的异常”错误。
我尝试了 AutoDetectChangesEnabled 但没有帮助

mydbcontext.Configuration.AutoDetectChangesEnabled = false;
mydbcontext.SaveChanges();

【问题讨论】:

  • 可能是属性值范围 exed。请显示属性值
  • 为什么不尝试使用批量插入?我相信它的性能也更好
  • @Bosco 批量上传在我的情况下不实用。我需要这种方式来解决我的问题。
  • @LDS 根据某些条件插入我的表。
  • 列值数据类型范围可能超出范围

标签: c# asp.net entity-framework model-view-controller


【解决方案1】:
context.BulkInsert(entitiesList);

对于 BulkInsert,请点击链接 https://github.com/borisdj/EFCore.BulkExtensions

另一个是sqlBulkCopy Fastest Way of Inserting in Entity Framework

如果您想在循环之外使用 Savechanges,请查看以下代码

try
{
    context.Configuration.AutoDetectChangesEnabled = false;
 
    foreach (var book in bookList)
    {
        context.Books.Add(book);
    }
    
    context.SaveChanges();
}
finally 
{
    context.Configuration.AutoDetectChangesEnabled = true;
}

【讨论】:

    【解决方案2】:

    “抛出了 'System.OutOfMemoryException' 类型的异常” - 当我不处置数据库时,这通常会发生在我身上。问题可能不是您尝试更新的记录数量,可能是因为这些记录保存在系统内存中。

    解决方案 1(推荐) 将您的数据库函数包装在“使用”语句中,这将自动处理您的数据库上下文并释放内存

    public void CreateRange(List<MyModel> modelList){
        using(DbContext db = new DbContext())
        {
           db.MyTable.AddRange(modelList); 
           db.SaveChanges();
        }
    }
    

    解决方案 2 调用'db.Dispose();'在每个方法结束之前

    public void CreateRange(List<MyModel> modelList){
        db.MyTable.AddRange(modelList); 
        db.SaveChanges();
        db.Dispose();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 2016-09-20
      • 2014-01-29
      • 2020-11-12
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      相关资源
      最近更新 更多