SqlBulkCopy和实体框架

Ska*_*osh 16 .net c# entity-framework sqlbulkcopy

我目前的项目包括3个标准层:数据,业务和演示.我想使用数据实体来满足我的所有数据访问需求.应用程序的部分功能是需要将平面文件中的所有数据复制到数据库中.该文件不是很大,所以我可以使用SqlBulkCopy.我在.NET中找到了几篇关于SqlBulkCopy类用法的文章.但是,所有文章都使用DataTable来来回移动数据.

有没有办法将数据实体与SqlBulkCopy一起使用,还是必须使用DataTables?

Dav*_*gan 21

您需要将实体转换为IDataReader或DataTable.

有一个小助手类,旨在帮助:http: //archive.msdn.microsoft.com/LinqEntityDataReader/Release/ProjectReleases.aspx?ReleaseId = 389

编辑:msdn链接坏了,可以在这里找到alt拷贝:https: //github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs

然后您可以像这样使用SqlBulkCopy:

var sbCopy= new SqlBulkCopy(connectionString);
sbCopy.DestinationTableName = "TableName";
sbCopy.WriteToServer(entitiesList.AsDataReader()); 
Run Code Online (Sandbox Code Playgroud)

  • @JonBarker - 这是GitHub链接:https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs (2认同)

Dea*_*ard 6

我们在使用EF批量插入时尝试并测试了几种方法,最终使用表值参数来获得各种行大小的最佳性能.我没有数字,但我知道bcp/BULK INSERT与表值参数的性能是一个指导因素.

我们最初使用SqlBulkCopy的是一个带有IEnumerable<T>和创建的适配器IDataReader.它还为SqlBulkCopy生成了相关的元数据.这里的优点是导入只是代码.@davehogan发布的代码用作此基础.

表值参数需要存储过程和数据库中定义的表类型.如果您正在使用代码优先,则可以执行SQL以将其创建为创建脚本的一部分.虽然这是更多的工作,但我们发现我们在数据库中获得了更加一致和更快的行吞吐量.

此外,值得考虑不要批量插入主表.我们使用临时堆表,并在导入数据后向其添加聚簇索引.然后我们MERGE在临时表和主表之间执行.这样做的好处是在插入时不会锁定主表的索引并提高并发性.我们倾向于使用此方法插入每个插入CPU的2500行/秒.

如果您想了解更多信息,请告诉我.


Pre*_*gha 1

您可以将数据集视为数据实体的序列化。然而一般来说,我认为 SqlBulkCopy 是一个表到表的东西,因此是数据表的原因。