ASP.Net MVC 5 и уровни изоляции транзакций SQL

Возникла проблема с созданием внешнего интерфейса для базы данных. Я начал с EF6 Code First из базы данных. Я создал контроллер и пошел, чтобы выполнить тест на странице создания, но столкнулся с большой проблемой. Это дало мне следующую ошибку:

 System.Data.SqlClient.SqlException: Transaction failed in database 'DB' because the statement was run under snapshot isolation but the transaction did not start in snapshot isolation. You cannot change the isolation level of the transaction to snapshot after the transaction has started unless the transaction was originally started under snapshot isolation level.

Другой вещью, которая обнаружилась, был код от контроллера:

if (ModelState.IsValid)
{
    db.Characters.Add(character);
    await db.SaveChangesAsync();
    return RedirectToAction("Index");
}

Выделено ожидание db.SaveChangesAsync(); как строка ошибки. Так что теперь я запутался относительно того, где искать, чтобы изменить уровень транзакции в коде MVC. Будет ли это Web.config, модель, созданная для базы данных, или контроллер? Я знаю, что мне пришлось бы использовать TransactionScope, чтобы изменить его.
Проще было бы изменить область транзакции по умолчанию на то, для чего настроена база данных. Просто не уверен, где сделать это изменение?

1 ответ

В конструкторе вашего EF Контекст вы можете назвать следующую передачу в IsolationLevel ты хочешь

_ContextTransaction = Database.BeginTransaction(isolationLevel)

Затем, переопределив SaveChangesAsync в контексте вы можете совершить транзакцию

public override Task<int> SaveChangesAsync() {
    var result = base.SaveChangesAsync();
    _ContextTransaction.Commit();

}

Обратите внимание, что вам нужно Commit сделка для других Saving методы, и вы также можете рассмотреть возможность проверки, является ли контекст частью другой транзакции, прежде чем начинать новую с BeginTransaction(isolationLevel)

Для проверки текущих транзакций вы можете использовать System.Transactions.Transaction.Current

Другие вопросы по тегам