使用实体框架从csv文件大容量插入



我想使用实体框架从csv文件大容量插入到MS SQL Server数据库中。有没有使用实体框架进行批量插入的内置方法?

感谢

Entity框架中不支持批量插入。若您尝试添加数千个对象,只需将它们添加到DbSet,然后调用SaveChanges,性能就会显著下降。

using(var db = new Db()) 
{
    foreach(var item from data) 
    {
        db.Items.Add(item);
    }
    db.SaveChanges();
}

之所以会发生这种情况,是因为EF跟踪所有对象的变化,这会导致大量内存使用和高计算量。

根据您使用的EF版本和方法,您可以禁用跟踪更改,根据对象的大小和实际性能,按100或1000个项目中相对较小的部分插入对象。然后计算一次更改并保存。例如

int count = 100;
using (var db = new BloggingContext()) 
{ 
    data.Configuration.AutoDetectChangesEnabled = false; 
    foreach (var item in data) 
    { 
        db.Items.Add(item);
        --count;
        if(count <= 0) 
        {
            count = 100;
            db.SaveChanges();
        }
    } 
    db.SaveChanges(); // To make sure we save everything if the last part was smaller than 100
}

此外,很少有库支持大容量插入。例如:https://github.com/loresoft/EntityFramework.Extended

正如雅罗斯拉夫所评论的,实体框架团队没有直接支持批量插入

但是有3个库支持它:

  • 实体框架扩展(推荐,支持一切)
  • EntityFramework.BulkInsert(不支持,但支持所有简单场景)
  • EntityFramework.BulkUtilities(不支持,但支持一些简单的场景)

在这里你可以找到一篇关于三个库的小文章:实体框架-批量插入

示例:

using (var ctx = new EntitiesContext())
{
    // Do not use the ChangeTracker or require to add the list in the DbSet
    ctx.BulkInsert(list);
}

免责声明:我是项目实体框架扩展

的所有者

最新更新