使用 EntityFramework 扩展批量插入

Bulk insert using EntityFramework Extended

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

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

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

为什么?

这就是 EF6 "bulk" 插入的方式,它不是批量插入,而是逐行插入。结果性能很差。

改用EF.BulkInsert or EFUtilities

更新:

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

添加范围

添加范围不执行 BulkInsert,它只是在所有实体都添加到集合后检测一次更改。

DetectChange 方法可能非常慢。

参见:Entity Framework - DetectChanges Performance

如您所见,它在数据库中一个一个地保存实体,速度非常慢。

EF.Extended

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

批量插入库

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

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


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

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

  • 批量保存更改
  • 批量插入
  • 批量更新
  • 批量删除
  • 批量合并
  • 批量同步

示例:

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