实体框架6中多个上下文的单个事务

ven*_*kat 19 c# entity-framework-6

我们有一个场景可以在单个事务中从两个上下文中保存两个实体.

第1步 - SetTransaction(firstContext,true);

第2步 - 使用firstContext保存第一个实体.

第3步 - SetTransaction(secondContext,false);

第4步 - 使用secondContext保存第二个实体

第5步 - 最终提交事务.

void function SetTransaction(context, startNewTransaction)
{    
   var currentContext = firstContext;

   if (startNewTransaction)
   {
      var connection = currentContext.GetConnection();
      connection.Open();
      this.dbTransaction = connection.BeginTransaction();
   }

   if (this.dbTransaction != null)
   {
       currentContext.UseTransaction(dbTransaction);
   }
}
Run Code Online (Sandbox Code Playgroud)

执行第3步时,currentContext.UseTransaction(dbTransaction); line抛出异常为" 传入的事务与当前连接无关.只能使用与当前连接关联的事务 "

请建议如何解决.

Venkat.

Maa*_*ten 32

使用TransactionScope.EF将自动登记在正在运行的事务范围中.

它将要求您的连接字符串相同.

using (var scope = new TransactionScope()) {
    // Save entity in context A
    using (var contextA = new ContextA()) {
        contextA.Save(...);
        contextA.SaveChanges;
    }
    // Save entity in context B
    using (var contextB = new ContextB()) {
        contextB.Save(...);
        contextB.SaveChanges;
    }
    // Commit tx-scope
    scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)