在实体框架中批量插入后批量插入记录并获取它们的 ID
Posted
技术标签:
【中文标题】在实体框架中批量插入后批量插入记录并获取它们的 ID【英文标题】:Bulk insert records and get their Id's after bulk insert in Entity Framework 【发布时间】:2017-11-01 18:49:30 【问题描述】:我想在一个表中批量插入 100,000 多行(该表有一个标识列,每次插入新行时都会自动递增)。
插入对性能影响最小的行的最快方法是什么?
插入所有行后,如何获取最近插入的行的id列表?
注意:我做了以下但我没有得到 id 列表
ctx.Documents.AddRange(documentsList);
ctx.SaveChanges();
var ids = documentsList.Select(d => d.Id);
谢谢
【问题讨论】:
【参考方案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
【讨论】:
这些位是否与“EF Plus”(entityframework-plus.net)相同?以上是关于在实体框架中批量插入后批量插入记录并获取它们的 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MySQL 上使用 Hibernate 批量插入递增的 ID?