GraphQL并行异步查询c#EF Core 3.0

时间:2019-12-14 11:01:32

标签: c# entity-framework async-await graphql .net-core-3.0

我正在尝试使用2个(或更多)异步子查询执行查询。遗憾的是,这是不可能的,因为DbContext当时只能处理1个请求。

该项目正在使用:

  • 实体框架3
  • Graphql 3.0.0

错误

  

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

类型:

Field<ListGraphType<A>>()
    .Name("A")
    .Description("query of A")
    .ResolveAsync(async context =>
        await repro.GetAllAAsync(context)
);

Field<ListGraphType<A>>()
            .Name("B")
            .Description("query of B")
            .ResolveAsync(async context =>
                await repro.GetAllBAsync(context)
            );

查询:

query {
  A {
    id
  }
  B {
    id
  }
}

DbContextPool不能解决问题,我也不想使用StructureMap。

是否有一种优雅的使用方式

  • 每个子查询有多个dbContext
  • 等待直到dbContext免费

1 个答案:

答案 0 :(得分:-1)

我最近创建了一个解决EF并行执行的项目。 您可以在这里看到实现

https://github.com/fenomeno83/graphql-dotnet-globalization-demo

在这里,您可以找到一个查询示例:

public class TestGroupQueries : ObjectGraphType
{
    public TestGroupQueries(IHttpContextAccessor _httpContextAccessor)
    {
        Name = "testQueries";

        FieldAsync<TestResponseType>(
            "demoQuery",
                arguments: new QueryArguments(new QueryArgument<NonNullGraphType<IntGraphType>> { Name = "input" }),
                resolve: async context =>
                {
                    //extension method that creates scope (IServiceScope) from IServiceProvider
                    using (var scope = _httpContextAccessor.CreateScope())
                    {
                       
                        //call DemoQuery method of TestService; GetService is an extension method that use GetRequiredService from scope serviceprovider
                        return await scope.GetService<ITestService>().DemoQuery(context.GetArgument<int>("input"));
                    }
                });

       
    }

您在解析器内部创建一个新范围并使用该范围的服务