2016-04-25 2 views
0

Я использую структуру сущности, и у меня есть несколько методов, где я использую транзакции. Я получаю эту ошибку: Соединение уже находится в транзакции и не может участвовать в другой транзакции. EntityClient не поддерживает параллельные транзакции. У меня есть несколько методов, в зависимости от «MethodB», как пример кода ниже:ошибка транзакции сущности Framework

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(); 
} 
Смежные вопросы