Доброе утро!
У меня давно работает 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 транскрипциями? Это связано с некоторыми таймаутами? Заранее спасибо