Одинарная транзакция в нескольких контекстах в 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);
   }
}

Выполняя Шаг 3, currentContext.UseTransaction(dbTransaction); строка выбрасывает исключение как " Прошедшая транзакция не связана с текущим подключением. Можно использовать только транзакции, связанные с текущим соединением"

Пожалуйста, предложите, как решить.

Venkat.

Ответы

Ответ 1

Используйте 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();
}