使用实体框架中的2个DbContexts回滚事务.使用TransactionScope或TransactionBegin?

Ehs*_*bar 7 c# entity-framework transactions transactionscope dbcontext

我有一个2 DbContext'秒,我可以在一个表格中调用它们,你可以在这里看到:

    dbcontext1.add(object);
    dbcontext1.save();
    dbcontext2.add(object);
    dbcontext2.save();
Run Code Online (Sandbox Code Playgroud)

所以我有一个问题:如果发生了一些问题并且我的记录被保存DbContext1但不是DbContext2,我需要回滚我的交易.

我搜索了一下,发现了两种方法:使用BeginTransactionTransactionScope.我很困惑我应该使用哪一个以及它们之间的区别是什么?

我找到了这样的东西,但我不知道;我不知道如何回滚这个:

using (TransactionScope scope = new TransactionScope())  
{
  using (EFEntities1 dc = new EFEntities1())
  {
     dc.USERS.Add(user);
     dc.SaveChanges();
  }

  using (EFEntities2 dc = new EFEntities2())
  {
     dc.USERS.Add(user);
     dc.SaveChanges();
  }

  scope.complete();
}
Run Code Online (Sandbox Code Playgroud)

最好的祝福

Mar*_* N. 9

我很困惑我应该使用哪一个以及它们之间的区别是什么?

不同之处在于TransactionScope,只要您将其与单个数据库连接(SQL Server 2005)一起使用或在同一数据库(SQL Server 2008及更高版本)上使用多个连接,其行为就像常规,轻量级和本地事务一样.如果在同一事务范围内使用两个或多个连接或访问多个数据库(同样,取决于SQL Server版本),则将其提升为分布式事务(因此在MSDTC中注册).在您的情况下,它将被提升.

我找到了类似的东西,但我不知道;我不知道如何回滚这个.

只要您不调用Complete,就会在范围结束后立即回滚事务范围(例如,处置,使用结束等).

如果任何一个db上下文抛出异常,那么Complete将不会调用您的代码并且将回滚该事务.

来自MSDN:

如果事务范围内没有发生异常(即,在TransactionScope对象的初始化和调用其Dispose方法之间),则允许进行范围参与的事务.如果事务范围内确实发生了异常,则将回滚它参与的事务.

这也是Rollback不存在方法的原因.

您可能还想查看要与其一起使用的隔离级别.默认是Serializable.