Параллельные асинхронные запросы с GraphQL для .NET и EF Core 3.0 - PullRequest
0 голосов
/ 22 октября 2019

Сводка

В настоящее время я выполняю миграцию проекта на AspNetCore 3.0 и столкнулся с проблемой с GraphQL для .NET ParallelExecutionStrategy при запросе нескольких вещей в одном запросе. Проект использует MSSQL Server в качестве хранилища данных, и доступ к нему осуществляется через Entity Framework Core 3.0. Я получаю ошибку:

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

Я могу решить эту проблему, если я реализую IDocumentExecuter и изменим ParallelExecutionStrategy для ожидания каждого отдельного выполнения, начиная с Task.WhenAll до await ExecuteNodeAsync (https://github.com/graphql-dotnet/graphql-dotnet/blob/master/src/GraphQL/Execution/ParallelExecutionStrategy.cs#L27).

Пример запроса, который я пытаюсь выполнить:

query {
  thingA {
    id
  }
  thingB {
    id
  }
}

Редактировать:

ИспользованиеDbContextPool, похоже, тоже не решает проблему:

services.AddDbContextPool<DBCONTEXT>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("CONNECTIONSTRING")));

1 Ответ

0 голосов
/ 22 октября 2019

Мы используем StructureMap для внедрения зависимостей, который создает новый DbContext для HttpRequest, но нам требовался уникальный DbContext для каждого запроса, решение заключалось в создании вложенного контейнера и запросе зависимостей через вложенный контейнер.

public Constructor(IContainer container) => _dbContext = container.GetNestedContainer()
    .GetInstance<DbContext>();
...