EF6 + SQL 14:将大量行上传到 table 中的最有效方法

EF6 + SQL 14: The most effective way to upload large number of rows into a table

使用 Entity Framework 6 和 SQL 服务器 2014:

我需要将 XML 文件中的 ~200,000 行上传到 SQL 服务器 table。每行有 5 个字段。一行数据不大,但是我的行数比较多

在 y C# 应用程序中,我可以毫无问题地解析 XML 文件并读取其在内存中的数据。但我担心每行向 SQL 服务器发送一个 TSQL 存储过程调用效率不高。在 EF6 中实现此要求的最有效方法是什么?

如果Entity Framework不是suitable,我可以直接用ADO.NET

尝试使用OPENROWSET并直接解析:

DECLARE @xml XML
SELECT @xml = BulkColumn
FROM OPENROWSET(BULK 'D:\sample.xml', SINGLE_BLOB) x

SELECT t.c.value('.', 'NVARCHAR(100)')
FROM @xml.nodes('root/row') t(c)
GO

通过在添加实体时设置 context.AutoDetectChangesEnabled = false 并在调用 SaveChanges 之前再次打开它,您可以从 Entity Framework 获得明显更好的性能。小批量添加实体并每次处理上下文也有帮助。

或者有一些第三方库做得更好:

EntityFramework.BulkInsert

Entity Framework Extensions

Entity Framework Plus

后两者是商业的,我相信 Entity Framework Plus 是 Entity Framework 扩展的演变。

您可以将多行打包到一个 DataTable 中,然后作为 table 值参数 (tvp) 传递给您的存储过程。您的存储过程可以使用 tvp 作为源执行 MERGE 语句,或者执行连接到 tvp 的 INSERT 语句。

使用直接 ADO.NET 效果很好。从快速 google 来看,它似乎也应该通过 Entity Framework 工作。例如:http://www.c-sharpcorner.com/UploadFile/78607b/using-table-valued-parameters-in-entity-framework

一些与tvps相关的链接:

http://www.sommarskog.se/arrays-in-sql-2008.html

http://www.sommarskog.se/arrays-in-sql-perftest-2009.html