2016-04-25 224 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(); 
}