首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlBulkCopy和实体框架

SqlBulkCopy和实体框架
EN

Stack Overflow用户
提问于 2010-03-31 22:02:10
回答 7查看 30.3K关注 0票数 17

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

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

EN

回答 7

Stack Overflow用户

发布于 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:

代码语言:javascript
复制
var sbCopy= new SqlBulkCopy(connectionString);
sbCopy.DestinationTableName = "TableName";
sbCopy.WriteToServer(entitiesList.AsDataReader()); 
票数 23
EN

Stack Overflow用户

发布于 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行/秒以上。

如果你想知道更多信息,请告诉我。

票数 6
EN

Stack Overflow用户

发布于 2017-04-17 21:58:52

您可以使用Bulk package库。批量插入1.0.0版本用于具有实体框架>=6.0.0的项目。更多描述可以在下面的链接- Bulkoperation source code 中找到

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2553545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档