.net 在Entity Framework 4.0中批处理DB命令
我当前的项目需要每天与外部系统同步。同步基于复杂的导入文件结构,该结构通过广泛的业务逻辑进行解析和处理。由于业务逻辑的原因,我们决定在.NET代码中实现这一点,并重用现有的BL组件,而不是在存储过程或集成服务中编写相同的逻辑 BL层位于EF4.0数据访问层之上。当前实现处理导入批处理,将所有更改填充到ObjectContext中,并在事务中执行SaveChanges。当我检查SQL profiler时,我看到EF以单个SQL命令的形式执行每个实体更改(使用它自己到DB的往返过程)。此外,看起来这些命令是完全按顺序执行的。因此,对于初始导入,我有多达100000次到数据库的往返,对于每日同步,我有10000到50000次到数据库的往返 是否可以通过EF本身或某些提供程序/扩展以某种方式批量插入/更新/删除命令 不,这是办不到的(是的,我也哭了) EF不支持批处理操作,LINQ-SQL也有同样的问题 您有几个选择:.net 在Entity Framework 4.0中批处理DB命令,.net,entity-framework,entity-framework-4,batch-processing,.net,Entity Framework,Entity Framework 4,Batch Processing,我当前的项目需要每天与外部系统同步。同步基于复杂的导入文件结构,该结构通过广泛的业务逻辑进行解析和处理。由于业务逻辑的原因,我们决定在.NET代码中实现这一点,并重用现有的BL组件,而不是在存储过程或集成服务中编写相同的逻辑 BL层位于EF4.0数据访问层之上。当前实现处理导入批处理,将所有更改填充到ObjectContext中,并在事务中执行SaveChanges。当我检查SQL profiler时,我看到EF以单个SQL命令的形式执行每个实体更改(使用它自己到DB的往返过程)。此外,看起来这
这三种方法的问题在于,您失去了EF抽象、内部图(乐观并发),并重新回到了原生SQL世界。请注意这个项目:magiq.codeplex.com 它将批处理操作引入LINQtoSQL,我们现在正在EntityFramework支持下工作
干杯SQL Server中有一些解决方法:
- 本文介绍了批插入
- 本文介绍了批量更新(和删除)
如果您对Oracle、MySQL、POstgreSQL或SQLite感兴趣,可以使用最新的Devart。在这些提供程序的最新版本中,SaveChanges方法已经集成了。这里有一种方法可以让您先使用代码,而且速度很快。将批量插入从>1小时加速到~5秒
与您共享一个GitHub项目就是为了实现这一点,到目前为止,它使用SqlBulkCopy透明地支持Sql server的批量插入/更新/删除。 还有其他的好东西,希望它能扩展到以后的轨道上。 使用它就像
var insertsAndupdates = new List<object>();
var deletes = new List<object>();
context.BulkUpdate(insertsAndupdates, deletes);
var insertsanddupdates=new List();
var deletes=新列表();
BulkUpdate(insertsanddupdates,deletes);
希望有帮助 因此,我将不得不接受当前的解决方案,因为重写解决方案不是一个选项:(是的,EF不是为批处理工作而设计的。特别是像“导入批处理”这样的东西——是一个数据库问题,而不是ORM问题。我甚至不会为此使用EF,我会有一个单独的服务(例如WCF——作为windows服务托管)其唯一责任是在需要同步时导入此批量数据。关注点分离。我以前的项目还需要将数据库与我们的和外部的同步。我们使用windows服务(在wcf日之前)。此项目的最后一次提交时间为2012年10月1日:(