据此,可以使用以下代码在实体中进行批量插入:
var customers = GetCustomers();
db.Customers.AddRange(customers);
db.SaveChanges();
我使用 SQL Profiler 来验证执行了多少插入查询,我看到列表的每个元素都有一个插入。
为什么?
据此,可以使用以下代码在实体中进行批量插入:
var customers = GetCustomers();
db.Customers.AddRange(customers);
db.SaveChanges();
我使用 SQL Profiler 来验证执行了多少插入查询,我看到列表的每个元素都有一个插入。
为什么?
添加范围
添加范围不执行 BulkInsert,它只是在将所有实体添加到集合后进行一次 DetectChanges。
DetectChange 方法可能非常慢。
正如您所注意到的,它将实体一个一个地保存在数据库中,这非常慢。
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;
});
这就是 EF6 进行“批量”插入的方式,它不是批量插入,而是逐行插入。结果性能很差。
更新:
DbSet<T>.AddRange()
是内置 API 的一部分,这样您就不会使用 EF.Extended 或任何其他 3rd 方库。