在Entity Framework 4.0中批处理DB命令

时间:2010-12-10 09:30:03

标签: .net entity-framework entity-framework-4 batch-processing

我目前的项目需要每天与外部系统同步。同步基于复杂的导入文件结构,该结构使用广泛的业务逻辑进行解析和处理。由于业务逻辑,我们决定在.NET代码中实现这一点,并重用现有的BL组件,而不是在存储过程或集成服务中编写相同的逻辑。

BL层位于EF 4.0数据访问层之上。当前实现过程导入批处理,将所有更改填入ObjectContext并在事务中执行SaveChanges。当我检查SQL分析器时,我看到EF将每个实体更改作为单个SQL命令执行(具有自己的往返DB的往返)。此外,看起来这些命令是完全顺序执行的。因此,我有多达100.000次往返数据库进行初始导入,以及10.000 - 50.000次往返数据库进行日常同步。

是否可以通过EF本身或某些提供商/扩展程序以某种方式批量插入/更新/删除命令?

5 个答案:

答案 0 :(得分:9)

不,它无法完成(是的 - 我也哭了)。

EF不支持批处理操作,LINQ-SQL也有(有)同样的问题。

你有几个选择:

  1. 存储过程
  2. Classic ADO.NET或EntitySQL
  3. 触发器
  4. 我过去选择过1和3。

    这三种方法的问题在于你失去了EF抽象,内部图形(乐观并发),以及你带回原生SQL的世界。

答案 1 :(得分:3)

请注意以下项目:magiq.codeplex.com

它将批处理操作带到linq-to-sql,我们现在正在使用EntityFramework支持。

干杯

答案 2 :(得分:3)

SQL Server中有一些解决方法:

如果您对Oracle,MySQL,POstgreSQL或SQLite感兴趣,可以使用最新的Devart dotConnect providersBatchUpdates functionality已集成在这些提供程序的最新版本的SaveChanges方法中。

答案 3 :(得分:0)

这是一种允许您首先使用代码POCO并且速度很快的方法。从>加速批量插入物1小时到5秒。

SqlBulkCopy for Generic List (useful for Entity Framework & NHibernate)

答案 4 :(得分:0)

刚刚与您共享一个GitHub项目,截至目前,它支持使用SqlBulkCopy透明地为Sql服务器批量插入/更新/删除。 Online regex tester with explanations 还有其他好东西,并且希望,它将扩展到更多的轨道。 使用它就像

一样简单
var insertsAndupdates = new List<object>();
var deletes = new List<object>();
context.BulkUpdate(insertsAndupdates, deletes);

希望它有所帮助!