使用 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(付费但支持)
- EntityFramework.BulkInsert(不再支持)
- EFUtilities(不再支持)
请注意,两个免费库都不支持所有继承和关联。
免责声明:我是项目的所有者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;
});
根据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(付费但支持)
- EntityFramework.BulkInsert(不再支持)
- EFUtilities(不再支持)
请注意,两个免费库都不支持所有继承和关联。
免责声明:我是项目的所有者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;
});