Как исправить «System.InvalidOperationException: недопустимая попытка вызова Read, когда читатель закрыт» при вызове скомпилированного запроса - PullRequest
4 голосов
/ 26 марта 2019

При вызове ToList () после вызова скомпилированного запроса иногда (!) Я получаю исключение - System.InvalidOperationException: недопустимая попытка вызова Read, когда читатель закрыт.

Контекст БД создается для каждого вызова "invoke", запросы синхронно компилируются перед вызовом. Фрагмент кода называется одноразовым профессиональным файлом, который читается асинхронно.

Запрос инициализируется, компилируется и вызывается следующим образом.

public Func<SANAContext, int, string, IEnumerable<KeyValuePair<string, Importartikelhash>>> ImportingArticlesHashesQuery;

...

ImportingArticlesHashesQuery = EF.CompileQuery((SANAContext db, int LaLiNr, string lagerId) => db.Importartikelhash.AsNoTracking()
            .Where(la => la.LieferantartikelId == LaLiNr && string.Compare(la.LagerId, lagerId, StringComparison.Ordinal) == 0).Select(a => new KeyValuePair<string, Importartikelhash>(a.LieferartikelNr, a)));

...    

List<KeyValuePair<string, Importartikelhash>> records = ImportingArticlesHashesQuery.Invoke(context, supplier.SupplierInternalId, warehouse.Id).ToList();  

На большом количестве данных я получаю исключение:

   {System.InvalidOperationException: Invalid attempt to call Read when reader is closed.
   at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
   at System.Data.SqlClient.SqlDataReader.Read()
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.BufferlessMoveNext(DbContext _, Boolean buffer)
   at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementation[TState,TResult](Func`3 operation, Func`3 verifySucceeded, TState state)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
   at System.Collections.Generic.List`1.AddEnumerable(IEnumerable`1 enumerable)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Sanalogic.SupplierArticlesImport.SupplierDataParserApplication.Services.QueriesCompiler.DBHashValuesCache(PricatSupplier supplier, PricatWarehouse warehouse) in QueriesCompiler.cs:line 90}

Что может вызвать проблему? Я понимаю, что существует некоторая проблема с асинхронными операциями, но я не знаю, где ее искать.

Любая помощь высоко ценится!

1 Ответ

0 голосов
/ 26 марта 2019

Не могли бы вы попытаться увеличить время ожидания команды в вашем контексте, как показано ниже:

    public class MyDatabase : DbContext
{
    public MyDatabase ()
        : base(ContextHelper.CreateConnection("Connection string"), true)
    {
        ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
    }
}
...