加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 实体框架慢AddRange插入到DB

发布时间:2020-12-15 22:12:13 所属栏目:百科 来源:网络整理
导读:我正在实现一个 Database First Entity Framework 6.1,将大约2000个主/详细信息集合插入SQL server db.每个集合大约有2~3个对象.所以要插入的总数或记录是?5000.事务大约需要2~3min,这是非常慢的.我正在使用以下代码: public class Collection{ [Key] publi
我正在实现一个 Database First Entity Framework 6.1,将大约2000个主/详细信息集合插入SQL server db.每个集合大约有2~3个对象.所以要插入的总数或记录是?5000.事务大约需要2~3min,这是非常慢的.我正在使用以下代码:

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();
}

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

解决方法

我刚刚经历了同样的事情,并且AddRange()需要几分钟才能在EF 6.1中添加1200条记录,因为当你查看探查器时它一次只执行一次INSERTS,因此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();

我从几分钟到2-3秒,甚至从我的计算机到Azure SQL数据库.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读