【问题标题】:Bulk insert from a csv file using Entity Framework使用实体框架从 csv 文件批量插入
【发布时间】:2016-04-19 17:07:41
【问题描述】:

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

谢谢

【问题讨论】:

    标签: entity-framework-6 bulkinsert ef-bulkinsert


    【解决方案1】:

    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

    【讨论】:

    • EntityFramework.Extended 不支持批量插入。
    • @JonathanMagnan 是的,你是对的......只有更新和删除。我忘记了。
    【解决方案2】:

    正如 Yaroslav 所说,Entity Framework 团队没有直接支持 Bulk Insert,

    但是有 3 个库支持它:

    这里可以找到关于三个库的小文章:Entity Framework - Bulk Insert

    例子:

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

    免责声明:我是项目的所有者Entity Framework Extensions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2017-09-28
      • 2012-03-31
      • 2020-12-07
      相关资源
      最近更新 更多