需要使用实体框架将大量记录插入数据库
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。显然,使用量取决于您的预算。
【讨论】:
以上是关于需要使用实体框架将大量记录插入数据库的主要内容,如果未能解决你的问题,请参考以下文章
实体框架插入使用 Z.EntityFramework 的 SingleInsertAsync 方法返回 IDENTITY