需要使用实体框架将大量记录插入数据库

Posted

技术标签:

【中文标题】需要使用实体框架将大量记录插入数据库【英文标题】:Huge number of records needs to be inserted into the database using Entity Framework 【发布时间】:2019-06-19 14:02:56 【问题描述】:

我有一个应用程序,它利用 web 服务定期获取数据,并且需要将记录插入 Sql Server 数据库。需要检查表的唯一键是否存在,如果存在则更新记录,不存在则插入记录。

我需要一个像 Oracle 数据库中的 Merge 这样的解决方案来消除重复记录的想法,以及像批量插入这样的东西,在 EF 中一次插入所有数据。

我使用了 AddRange 和 SaveChanges,但它在 DB 中使用了多次插入和更新,这需要很长时间才能完成。

【问题讨论】:

批量插入到临时表,然后在数据库上运行MERGE(或单独的INSERT/UPDATE 语句,MERGE 并没有真正为简单的场景增加太多)。如果您使用的是 SQL Server 2016+,则可以将暂存表设为内存表,以获得额外的性能。 @JeroenMostert 支持 EF 吗? 如果没有一些简单的方法让 EF 使用 TDS 批量协议进行插入(通常通过 SqlBulkCopy 公开),我会感到失望,因为这是从客户端到服务器。但是我对EF还不够了解。如果没有办法用 EF 做到这一点,那么没有它仍然值得。 【参考方案1】:

为此,有一个框架为 EF 添加了一些扩展方法。名字是ZZZ框架https://zzzprojects.com/。

为了加快插入速度,您可以使用此框架中提供的 BulkSaveChanges 来批量发送插入。这种方法会减少网络往返,并且会大大提高保存性能

context.BulkSaveChanges();

context.BulkSaveChanges(options => options.BatchSize = 100)

它还支持 Merge 操作,类似于 Oracle 中可用的操作。

var bulk = new BulkOperation(connection);
bulk.BulkInsert(dt);
bulk.BulkUpdate(dt);
bulk.BulkDelete(dt);
bulk.BulkMerge(dt);

【讨论】:

有支持EF Core的版本,但我认为是商业版【参考方案2】:

有免费的 3rd 方 NuGet 包可以为您进行批量插入,例如 https://www.nuget.org/packages/RudeySH.EFUtilities。但这并不完全符合您的要求。

然后在https://entityframework-extensions.net/ 有一个受欢迎的商业广告。它增加了对批量合并的支持。 https://entityframework-extensions.net/bulk-merge。显然,使用量取决于您的预算。

【讨论】:

以上是关于需要使用实体框架将大量记录插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

实体框架更新/插入多个实体

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

为啥实体框架在保存时锁定表?

实体框架:多对多插入重复

实体框架插入使用 Z.EntityFramework 的 SingleInsertAsync 方法返回 IDENTITY

实体框架:在插入新记录之前检查记录是不是存在