我目前的项目需要每天与外部系统同步。同步基于复杂的导入文件结构,该结构使用广泛的业务逻辑进行解析和处理。由于业务逻辑,我们决定在.NET代码中实现这一点,并重用现有的BL组件,而不是在存储过程或集成服务中编写相同的逻辑。
BL层位于EF 4.0数据访问层之上。当前实现过程导入批处理,将所有更改填入ObjectContext并在事务中执行SaveChanges。当我检查SQL分析器时,我看到EF将每个实体更改作为单个SQL命令执行(具有自己的往返DB的往返)。此外,看起来这些命令是完全顺序执行的。因此,我有多达100.000次往返数据库进行初始导入,以及10.000 - 50.000次往返数据库进行日常同步。
是否可以通过EF本身或某些提供商/扩展程序以某种方式批量插入/更新/删除命令?
答案 0 :(得分:9)
不,它无法完成(是的 - 我也哭了)。
EF不支持批处理操作,LINQ-SQL也有(有)同样的问题。
你有几个选择:
我过去选择过1和3。
这三种方法的问题在于你失去了EF抽象,内部图形(乐观并发),以及你带回原生SQL的世界。
答案 1 :(得分:3)
请注意以下项目:magiq.codeplex.com
它将批处理操作带到linq-to-sql,我们现在正在使用EntityFramework支持。
干杯
答案 2 :(得分:3)
SQL Server中有一些解决方法:
批量插入内容在Entity Framework Bulk Copy文章
批量更新(和删除)在Multiple entity updates with Entity Framework – EF Fetch Updates文章中有所描述。
如果您对Oracle,MySQL,POstgreSQL或SQLite感兴趣,可以使用最新的Devart dotConnect providers。 BatchUpdates 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);
希望它有所帮助!