Скопировано из GitHub - https://github.com/dotnet/ef6/issues/1615
Я использую EF 6.2 и у меня возникла проблема, связанная с использованием DbExecutingStrategy для повторные блокировки базы данных повтора.
В документации видно, что транзакции пользователя не поддерживаются. Однако я считаю, что фреймворк должен определять, когда они используются, и генерировать исключение. Это не происходит для меня.
Это известная ошибка в 6.2? Я посмотрел на этапы 6.3 и 6.4 и не вижу никаких закрытых проблем, решающих эту проблему.
Мой код выглядит следующим образом:
using (var tran = this._devContext.Database.BeginTransaction())
{
this._devContext.Database.ExecuteSqlCommand(sql);
tran.Rollback();
}
В моем случае это тестовый код и выполнение SQL вызывает тупик. Что происходит, когда я использую DbExecutionStrategy , это то, что SQL успешно повторен, и он работает. Однако, когда вызывается tran.Rollback()
, генерируется исключение, потому что повторная попытка проигнорировала пользовательскую транзакцию и зафиксировала запрос.
Вот исключение, которое возникает:
Message: Value cannot be null. Parameter name: connection
System.Data.Entity.Utilities.Check.NotNull[T](T value, String parameterName):14
System.Data.Entity.Infrastructure.Interception.DbTransactionInterceptionContext.WithConnection(DbConnection connection)
System.Data.Entity.Infrastructure.Interception.DbTransactionDispatcher.Rollback(DbTransaction transaction, DbInterceptionContext interceptionContext):50
System.Data.Entity.Core.EntityClient.EntityTransaction.Rollback()
Я бы ожидал, что EF идентифицирует пользовательскую транзакцию и выдаст исключение перед запуском SQL.
Обновление
Я повторил ту же проблему в EF 6.4