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

C# 需要使用实体框架将大量记录插入数据库,c#,entity-framework,C#,Entity Framework,我有一个应用程序,它利用Web服务定期获取数据,并且需要将记录插入Sql Server数据库。它需要检查表是否存在唯一键,如果存在,则必须更新记录,如果不存在,则应插入记录 我需要一个解决方案,如oracle数据库中的Merge,以消除重复记录的想法,以及EF中的bulk insert,以一次性插入所有数据 我使用了AddRange和SaveChanges,但它在DB中使用了几个插入和更新,这需要很长时间才能完成。有免费的第三方NuGet软件包为您进行批量插入,例如。但这并不是你想要的 还有一个

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

我需要一个解决方案,如oracle数据库中的Merge,以消除重复记录的想法,以及EF中的bulk insert,以一次性插入所有数据


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

有免费的第三方NuGet软件包为您进行批量插入,例如。但这并不是你想要的


还有一个很受欢迎的广告。它增加了对批量合并的支持。显然,使用率取决于您的预算。

有一个框架为此目的向EF添加了一些扩展方法。名称是ZZZ框架

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

context.BulkSaveChanges();

context.BulkSaveChanges(options => options.BatchSize = 100)
它还支持合并操作,类似于Oracle中提供的操作

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

大容量插入到暂存表,然后在数据库上运行
MERGE
(或者分离
insert
/
UPDATE
语句,
MERGE
对于简单的场景来说并不会增加太多内容)。如果您使用的是SQL Server 2016+,则可以将暂存表制作为内存中的表,以获得额外的性能。@Jeroenmoster它是否支持EF?如果没有简单的方法让EF使用TDS批量协议进行插入(通常通过
SqlBulkCopy
公开),我会感到失望,因为这是从客户端到服务器获取行的最快方法。但我对EF的了解还不够。如果用EF做不到这一点,没有它还是值得的。有一个版本支持EF核心,但我认为它是商业化的