Я использую EF 6 с шаблоном UoW. У меня есть несколько контекстов, определенных в моем UoW, так как я использую данные из нескольких баз данных. Кажется, что все работает правильно, кроме функции CommitAsync, которую я определил. Вот код, у меня есть:Использование асинхронных изменений сохранения в Entity Framework с несколькими контекстами
public async Task CommitAsync()
{
try
{
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
if (_context1 != null)
await _context1.SaveChangesAsync();
if (_context2 != null)
await _context2.SaveChangesAsync();
scope.Complete();
}
}
catch (DbEntityValidationException ex)
{
//..
}
}
Когда я запускаю этот спасительный изменения в обоих контекстах я получаю код:
Менеджер транзакций отключил поддержку удаленных/сетевых операций. (Исключение из HRESULT: 0x8004D024)
Ожидание _context2.SaveChangesAsync(); где происходит ошибка. Если я удалю TransactionScope из этой функции, код, похоже, будет работать без ошибок. Я не решаюсь удалить область для нескольких контекстов.
Только в случае, если это поможет, вот код, я использую, чтобы вызывать эту функцию:
state.Name = "Texas";
_uow.StateRepository.Update(state);
user.FirstName = "John";
_uow.UserRepository.Update(user);
await _uow.CommitAsync();
Спасибо!
Нет ничего плохого в коде, это конфиг на коробке с кодом msdtc, который отключил удаленные/сетевые транзакции. –
Почему вы хотите использовать TransactionScope? Если сбой сохранения не удастся, он все равно будет отменен. Использование TransactionScope просто приводит к возможным взаимоблокировкам. –
@JamieRees Я подозреваю, что OP хочет, чтобы оба обновления работали или оба потерпели неудачу, и избегали ситуации, когда один работал, но один из них не удался. –