Entity Framework core 2.1 Использование AsNoTracking с несколькими Async дает InvalidOperationException: соединение не было закрыто - PullRequest
0 голосов
/ 19 октября 2018

Я запустил два метода Async, используя Entity Framework 2.1 - один для выбора общего количества и другой для получения данных страницы - и я пометил свою сущность AsNoTracking следующим образом:

var dbContext = new SamuraiAppDataCoreContext();

var query = dbContext.Samurais.AsNoTracking();
var pageQuery = query.Skip(0).Take(10);

var totalCountTask = query.CountAsync();
var pageRecordsTask = pageQuery.ToListAsync();

await Task.WhenAll(totalCountTask, pageRecordsTask);

var results = new { TotalCount = totalCountTask.Result, Pages = pageRecordsTask.Result };

Затем я получил следующееошибка

InvalidOperationException: соединение не было закрыто.Текущее состояние соединения - подключение. System.Data.ProviderBase.DbConnectionClosedConnecting.TryOpenConnection (DbConnection externalConnection, DbConnectionFactory connectionFactory, TaskCompletionSource retry, DbConnectionOptions userOptions

* 10111014 * Примечания: ошибка исчезает в следующих сценариях

  1. Удаление "AsNoTracking"
  2. с использованием await для каждой асинхронной

    var totalCount = await query.CountAsync();
    var pageRecords = await pageQuery.ToListAsync();
    

И мой вопрос:
, почему AsNoTracking не работает с мульти-асинхронными вызовами?

1 Ответ

0 голосов
/ 14 июля 2019

У меня была точно такая же проблема, после некоторых исследований я нашел тот же ответ, что и @CamiloTerevinto.

EF Core не поддерживает несколько параллельных операций, выполняемых на одном и том же экземпляре контекста.Вы должны всегда ждать завершения операции, прежде чем начинать следующую операцию.Обычно это делается с помощью ключевого слова await в каждой асинхронной операции.

https://docs.microsoft.com/en-us/ef/core/querying/async

Таким образом, решение заключается в создании экземпляра контекста для каждого запроса, как в примере здесьhttps://riptutorial.com/entity-framework/example/13437/execute-multiple-queries-async-and-in-parallel

...