我当前正在将一个项目迁移到AspNetCore 3.0,并且在一个查询中查询多个内容时,.Q
在先前的操作完成之前,第二个操作在此上下文上开始。这通常是由使用相同DbContext实例的不同线程引起的。
如果我实现了 IDocumentExecuter 并更改ParallelExecutionStrategy以等待每个单独的执行,从Task.WhenAll
到await ExecuteNodeAsync
(https://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")));
答案 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