2016-04-25 216 views
0

我正在使用實體框架,我有幾種使用事務的方法。我得到這個錯誤:連接已經在一個事務中,並且不能參與另一個事務。 EntityClient不支持並行事務。 我有根據「方法b」如下面的代碼示例多種方法:實體框架事務錯誤

public void MethodA(){ 
    using (var tran = Db.Database.BeginTransaction()){ 
     MethodB(); 
     var tableARecord = new TableARecord(); 
     try 
     { 
      _context.TableAs.Add(tableARecord) 
      Db.SaveChanges(); 
     } 
     catch (Exception excp) 
     { 
      tran.Rollback(); 
      throw; 
     } 
    } 
} 

public void MethodC(){ 
    using (var tran = Db.Database.BeginTransaction()){ 
     MethodB(); 
     //do something else 
    } 
} 

public int MethodB(){ 
    int ret = 0 
    //exception happens when starting the transaction below 
    using (var tran = Db.Database.BeginTransaction()){ 
     //do something else 
    } 
    return ret; 
} 

回答

3

打開一個新的交易之前,您需要提交前一個,所以你不應該打開一個新的事務之前的內一。

public void MethodA(){ 
    using (var tran = Db.Database.BeginTransaction()){ 
     try 
     { 
      MethodB(); 
      var tableARecord = new TableARecord(); 
      _context.TableAs.Add(tableARecord) 
      Db.SaveChanges(); 
     } 
     catch (Exception excp) 
     { 
      tran.Rollback(); 
      throw; 
     } 
    } 
} 

public int MethodB(){ 
    int ret = 0 
    //exception happens when starting the transaction below 
    // The transaction is already open, you should not open a new one. 

    //do something else 
    return ret; 
    } 

但是,你這樣做的方式是反模式。每次「保存更改」時,不會在事務處理打開時進行,這將是單個事務。

您應該做的事情是在您的業務邏輯中開始您的交易,並在同一級別進行提交。

// Business Logic : 
var transaction = Db.Database.BeginTransaction()) 
try { 
    _Repository.MethodA(); 
    _Repository.MethodB(); 
    transaction.Commit(); 
} 
catch(){ 
    transaction.Rollback(); 
} 


//Repository : 

public void MethodA(){ 
    var tableARecord = new TableARecord(); 
    _context.TableAs.Add(tableARecord) 
    Db.SaveChanges(); 
} 

public void MethodA(){ 
    // Just do some other stuff 
    Db.SaveChanges(); 
}