实体框架缓慢的 AddRange 插入到 DB

Jim*_*Jim 6 c# entity-framework

我正在实施 Database First Entity Framework 6.1 以将大约 2000 个主/详细信息集合插入到 SQL 服务器数据库中。每个集合大约有 2~3 个对象。所以要插入的总数或记录是~5000。事务大约需要2~3分钟,非常慢。我正在使用以下代码:

public class Collection
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    ...

    public List<DetailCol> Details{ get; set; } 
}


public class DetailCol
    {
        [Key]
        public int Id { get; set; }
        public decimal Lvl { get; set; }
        public string Type { get; set; }
    }

var MyCollections = new List<Collection>();

// Do population of collection and try to insert to db

using (var db = new MyContext(ConnectionString)
{
    // Speed up insert
    db.Configuration.AutoDetectChangesEnabled = false;

    // Add new entries to master and details
    db.MyCollections.AddRange(MyCollections);

    // Update db
    db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

有人可以提示为什么会发生这种情况以及如何改进吗?

Ben*_*rey 4

我刚刚经历过同样的事情,AddRange() 需要几分钟的时间才能在 EF 6.1 中添加 1200 条记录,因为当您查看探查器时,它一次插入一条记录,因此 BulkCopy 将是您最快的选择。好消息是,对于基本的表插入,您可以通过安装此 nuget 包来使用名为 EntityFramework.BulkInsert 的扩展: EFBulkInsert

添加:使用EntityFramework.BulkInsert.Extensions;然后做这样的事情:

var options = new BulkInsertOptions();
options.BatchSize = 1000; // Default is 5000
efContext.BulkInsert<MyObject>(myList, options);
efContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

我从几分钟缩短到 2-3 秒,甚至从我的计算机到 Azure SQL 数据库也是如此。