NET和EF Core 3.0的GraphQL并行异步查询

时间:2019-10-22 07:23:14

标签: asp.net-core ef-core-3.0 graphql-dotnet

摘要

我当前正在将一个项目迁移到AspNetCore 3.0,并且在一个查询中查询多个内容时,.Q ParallelExecutionStrategy 的GraphQL遇到了问题。该项目使用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),我可以解决此问题。 / p>

我要执行的示例查询:

query {
  thingA {
    id
  }
  thingB {
    id
  }
}

编辑:

使用DbContextPool似乎也不能解决问题:

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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