在Entity Framework 4.0中批量处理数据库命令

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

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

EF本身或某些供应商/扩展可能批量插入/更新/删除命令?

不,不能做(是的 – 我也哭了)。

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

你有几个select:

  1. 存储过程
  2. 传统的ADO.NET或EntitySQL
  3. 触发器

我已经select了过去的选项1和3。

所有这三种方法的问题是你失去了EF抽象,内部图(乐观并发),并且把你带回了本地SQL的世界。

请注意这个项目:magiq.codeplex.com

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

干杯

在SQL Server中有一些解决方法:

  • 批量插入在“ entity framework批量复制”文章中进行了介绍

  • 批量更新(和删除)在多个实体更新与entity frameworkEF EFetch更新文章中描述。

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

这里有一种方法可以让你首先使用你的代码POCO,速度很快。 将大块插件从大于1小时加速到〜5秒。

通用列表的SqlBulkCopy(对entity framework和NHibernate有用) 。

只是为了与你共享一个GitHub项目,到目前为止,它支持透明地使用SqlBulkCopy批量插入/更新/删除Sql服务器。 https://github.com/MHanafy/EntityExtensions还有其他的好东西,希望能延伸到更多的轨道上。; 使用它就像

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

希望它有帮助!