Asyn c транзакция Entity Framework 6.2 - PullRequest
0 голосов
/ 05 марта 2020

Доброе утро!

У меня давно работает asyn c Транзакция с ошибками с некоторыми другими ошибками.

Есть метод с выполнением транзакции

public T PerformInTransaction<T>(Func<ITransaction> beginTransaction, Func<ITransaction, T> func)
        {
            try
            {
                AzureDbConfiguration.SuspendExecutionStrategy = true;
                using (var transaction = beginTransaction())
                {
                    return func(transaction);
                }
            }
            finally
            {
                AzureDbConfiguration.SuspendExecutionStrategy = false;
            }
        }

Интерфейс ITranscation реализован по умолчанию для класса EF DbContextTransaction, как показано ниже:

public class Transaction : ITransaction
    {
        private readonly DbContextTransaction _transaction;

        public Transaction(DbContextTransaction transaction)
        {
            _transaction = transaction;
        }

        public Task CommitAsync()
        {
            this.Commit();

            return Task.CompletedTask;
        }

.... more methods
}

У меня есть операция preety long, выполняющаяся в транскрипции, где внутри у меня есть l oop с другими асинхронными c методами, и каждый метод может вызовите SaveChanges (). Фрагмент в основном выглядит как

await _unitOfWork.PerformInTransaction(async transaction =>
{ 
   foreach()
   {
      if(await Action())
        _unitOfWork.SaveChanges()
      else   
        transaction.Rollback()

   }

    transaction.Commit()  
})

У меня есть ошибки

System.InvalidOperationException: Неверная попытка вызова IsDBNull, когда читатель закрыт. в System.Data.SqlClient.SqlDataReader.CheckHeaderIsReady (Int32 columnIndex, логическое значение allowAsyn c, String methodName) в System.Data.SqlClient.SqlDataReader.IsDBNull (Int32 i) в lambda_methoper в (закрытие lambda_method). .Core.Common.Internal.Materialization.Coordinator 1.ReadNextElement(Shaper shaper) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper 1.SimpleEnumerator.d__4.MoveNext ()

или другой

System.Data.Entity.Core. EntityException: базовый поставщик не удалось при фиксации. ---> System.ArgumentNullException: значение не может быть нулевым. Имя параметра: соединение в System.Data.Entity.Utilities.Check.NotNull [T] (значение T, String имя-параметра) в System.Data.Entity.Infrastructure.Interception.DbTransactionInterceptionContext.WithConnection (соединение DbConnection)

Я делаю что-то не так с асин c транскрипциями? Это связано с некоторыми таймаутами? Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...