0

概括

我目前正在将一个项目迁移到 AspNetCore 3.0,并且在一个查询中查询多个内容时遇到了 GraphQL for .NET ParallelExecutionStrategy的问题。该项目使用 MSSQL Server 作为数据存储,并通过 Entity Framework Core 3.0 进行访问。我得到的错误是:

在前一个操作完成之前,在此上下文上开始了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的。

如果我实现IDocumentExecuter并将 ParallelExecutionStrategy 更改为等待每个单独的执行,我可以解决这个问题,从Task.WhenAllawait ExecuteNodeAsynchttps://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")));
4

3 回答 3

1

如果您使用的是内置的依赖注入容器,您应该考虑使用IServiceScopeFactory<T>. 它与Ganhammar的基于“StructureMap”的答案基本相同,只是它不是“服务定位器”。(相对简单的)IServiceScopeFactory<T>代码在这里,与这个问题相关的另一个答案在这里

于 2020-03-11T23:10:58.820 回答
0

我们使用 StructureMap 进行依赖注入,即为每个 HttpRequest 创建一个新的 DbContext,但我们需要为每个查询创建一个唯一的 DbContext,解决方案是创建一个嵌套容器并通过嵌套容器请求依赖项。

public Constructor(IContainer container) => _dbContext = container.GetNestedContainer()
    .GetInstance<DbContext>();
于 2019-10-22T10:46:53.143 回答
0

请参阅我解决此问题的实现。“技巧”是在解析器级别创建范围 https://github.com/fenomeno83/graphql-dotnet-globalization-demo

于 2020-08-13T09:22:46.353 回答