SaveChanges()中的自定义原子UPDATE命令

时间:2012-11-02 20:42:29

标签: c# entity-framework transactions dapper savechanges

由于各种原因,当我在UPDATE上调用SaveChanges时,我需要能够执行多个自定义SQL DbContext命令。我希望这可以原子方式发生,因此常规SaveChanges和SQL都可以成功,或者两者都不成功。

我不知道怎么做到这一点。到目前为止我所尝试的是这个以及各种变化:

EF transactions — Gist

这里的错误是(在ExecuteSqlCommand电话上):

  

当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery要求命令具有事务。

好的,够公平的。 ExecuteSqlCommand没有接受事务的重载。所以,我安装了Dapper软件包并用这个Dapper调用替换了违规行,我传递了交易:

this.Database.Connection
  .Execute("insert into Tests (Foo, Bar) values ('test', 2)", 
  transaction: tran);

但现在错误发生在base.SaveChanges()上,它给了我以下内容:

  

SqlConnection不支持并行事务。

显然SaveChanges总是创建一个新的事务,即使我已经在datacontext的连接上创建了一个呢?

我有什么办法可以完成我想要的任务吗?

我正在使用Entity Framework 5.0 Code First。

1 个答案:

答案 0 :(得分:3)

围绕所有操作包裹TransactionScope。此类是.NET事务的常见抽象。 EF和SqlConnection将自动登记。一定要寻找最佳实践,因为有一些陷阱,比如意外触发分布式事务。