Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在Entity Framework 4.0中批处理DB命令_.net_Entity Framework_Entity Framework 4_Batch Processing - Fatal编程技术网

.net 在Entity Framework 4.0中批处理DB命令

.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的往返过程)。此外,看起来这

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

BL层位于EF4.0数据访问层之上。当前实现处理导入批处理,将所有更改填充到ObjectContext中,并在事务中执行SaveChanges。当我检查SQL profiler时,我看到EF以单个SQL命令的形式执行每个实体更改(使用它自己到DB的往返过程)。此外,看起来这些命令是完全按顺序执行的。因此,对于初始导入,我有多达100000次到数据库的往返,对于每日同步,我有10000到50000次到数据库的往返

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

不,这是办不到的(是的,我也哭了)

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

您有几个选择:

  • 存储过程
  • 经典的ADO.NET或EntitySQL
  • 触发
  • 我过去曾选择过选项1和3


    这三种方法的问题在于,您失去了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日:(