【问题标题】:Parallel async queries with GraphQL for .NET and EF Core 3.0使用 GraphQL for .NET 和 EF Core 3.0 进行并行异步查询
【发布时间】:2020-02-18 07:05:12
【问题描述】:

总结

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-23
          • 1970-01-01
          • 1970-01-01
          • 2020-03-13
          • 2020-03-29
          相关资源
          最近更新 更多