使用EntityFramework Extended批量插入

时间:2017-04-02 03:15:46

标签: c# sql sql-server entity-framework entity-framework-extended

根据this,可以使用以下代码制作实体中的批量插入:

 var customers = GetCustomers();   
 db.Customers.AddRange(customers);   
 db.SaveChanges();  

我使用SQL事件探查器来验证执行了多少个插入查询,我看到列表中的每个元素都有一个插入。

enter image description here

为什么?

2 个答案:

答案 0 :(得分:3)

<强>的AddRange

添加范围不会执行BulkInsert,只需在将所有实体添加到集合后检测一次。

DetectChange方法可能非常慢。

请参阅:Entity Framework - DetectChanges Performance

正如您所注意到的,它将实体逐个保存在数据库中,这种实体是INSANELY慢的。

<强> EF.Extended

不再支持此库,并且没有批量插入功能。

批量插入库

有三个主要的库支持批量插入:

请注意,两个免费库都不支持所有继承和关联。

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

除了批量插入外,此库还允许您执行所有批量操作:

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge
  • BulkSynchronize

示例:

// Easy to use
context.BulkSaveChanges();

// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);

// Perform Bulk Operations
context.BulkDelete(customers);
context.BulkInsert(customers);
context.BulkUpdate(customers);

// Customize Primary Key
context.BulkMerge(customers, operation => {
   operation.ColumnPrimaryKeyExpression = 
        customer => customer.Code;
});

答案 1 :(得分:1)

这就是EF6如何做&#34;批量&#34;插入,它不是批量,而是逐行。结果表现很糟糕。

改为使用EF.BulkInsertEFUtilities

<强>更新

DbSet<T>.AddRange()是内置API的一部分,这样您就不会使用EF.Extended或任何其他第三方库。