我当前的项目由3个标准层组成:数据层、业务层和表示层。我想使用数据实体来满足我所有的数据访问需求。该应用程序的部分功能将需要将平面文件中的所有数据复制到数据库中。文件不是很大,所以我可以使用SqlBulkCopy。我找到了几篇关于在.NET中使用SqlBulkCopy类的文章,然而,所有的文章都是使用DataTables来回移动数据。
有没有办法将数据实体与SqlBulkCopy一起使用,或者我必须使用DataTables?
发布于 2012-02-06 23:18:02
您需要将实体转换为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()); 发布于 2013-10-14 15:50:42
在使用EF进行批量插入时,我们尝试并测试了几种方法,最终使用表值参数在一定的行大小范围内获得最佳性能。我手头没有数据,但我知道这个Performance of bcp/BULK INSERT vs. Table-Valued Parameters是一个指导性因素。
我们最初使用的SqlBulkCopy与一个适配器结合使用,该适配器获取一个IEnumerable<T>并创建一个IDataReader。它还为SqlBulkCopy生成了相关的元数据。这里的优点是,导入是只有代码的事情。@davehogan发布的代码被用作这一点的基础。
表值参数需要一个存储过程和一个在数据库中定义的表类型。如果您使用的是code-first,那么您可以执行SQL来创建这些代码作为您的创建脚本的一部分。虽然这是更多的工作,但我们发现我们获得了更一致和更快的数据库行吞吐量。
此外,值得考虑将而不是批量插入到主表中。我们使用临时堆表,并在导入数据后向其添加聚集索引。然后,我们在临时表和主表之间执行MERGE。这样做的好处是在插入时不会锁定主表的索引,并提高了并发性。我们倾向于使用这种方法插入的每个CPU达到2500行/秒以上。
如果你想知道更多信息,请告诉我。
发布于 2017-04-17 21:58:52
您可以使用Bulk package库。批量插入1.0.0版本用于具有实体框架>=6.0.0的项目。更多描述可以在下面的链接- Bulkoperation source code 中找到
https://stackoverflow.com/questions/2553545
复制相似问题