在实体框架中批量插入后批量插入记录并获取它们的 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 DeleteBatch Update

【讨论】:

这些位是否与“EF Plus”(entityframework-plus.net)相同?

以上是关于在实体框架中批量插入后批量插入记录并获取它们的 ID的主要内容,如果未能解决你的问题,请参考以下文章

在 GAE 中使用任务队列插入批量数据

如何在 MySQL 上使用 Hibernate 批量插入递增的 ID?

使用AFTER INSERT触发器将实体框架插入表中

实体框架和经典 Ado.net 之间的单个事务或批量插入操作下的 SqlBulkCopy 多个表插入

如何在 MySQL 中进行批量插入

Kafka JDBC Sink Connector,批量插入值