【问题标题】:Bulk insert records and get their Id's after bulk insert in Entity Framework在实体框架中批量插入后批量插入记录并获取它们的 ID
【发布时间】:2017-11-01 18:49:30
【问题描述】:
我想在一个表中批量插入 100,000 多行(该表有一个标识列,每次插入新行时都会自动递增)。
插入对性能影响最小的行的最快方法是什么?
插入所有行后,如何获取最近插入的行的id列表?
注意:我做了以下但我没有得到 id 列表
ctx.Documents.AddRange(documentsList);
ctx.SaveChanges();
var ids = documentsList.Select(d => d.Id);
谢谢
【问题讨论】:
标签:
c#
sql
entity-framework
entity-framework-6
【解决方案1】:
实体框架中没有Bulk Insert。您必须使用第三方库来执行此类操作。
默认情况下,Entity Framework 将为每个要保存的实体进行数据库往返。因此,在您的场景中将需要超过 100,000 次数据库往返,这INSANELY很慢。
免责声明:我是Entity Framework Extensions的所有者
此库不是免费的,但允许您执行所有批量操作,包括 BulkInsert 并自动返回 Id's。您还可以使用IncludeGraph 选项插入相关实体:
- 批量保存更改
- 批量插入
- 批量删除
- 批量更新
- 批量合并
例子
// 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;
});
编辑:回答问题
那些和“EF Plus”是一样的吗
我也是Entity Framework Plus的所有者
简而言之,我们将免费和付费功能分为两个库。 EF+ 不支持Bulk Operations。
这两个库目前共享的唯一功能是 Batch Delete 和 Batch Update