3

据此,可以使用以下代码在实体中进行批量插入

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

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

在此处输入图像描述

为什么?

4

2 回答 2

3

添加范围

添加范围不执行 BulkInsert,它只是在将所有实体添加到集合后进行一次 DetectChanges。

DetectChange 方法可能非常慢。

请参阅:实体框架 - DetectChanges 性能

正如您所注意到的,它将实体一个一个地保存在数据库中,这非常慢。

EF.扩展

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

批量插入库

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

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


免责声明:我是实体框架扩展项目的所有者

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

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

例子:

// 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;
});
于 2017-04-02T11:56:36.720 回答
3

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

请改用EF.BulkInsertEFUtilities

更新:

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

于 2017-04-02T03:36:14.630 回答