как внедрить контекст базы данных в graphql-dotnet

ConfigureServices

services.AddSingleton<IServiceProvider>(c => new FuncServiceProvider(type => c.GetRequiredService(type)));
services.AddDbContext<Context>(options => options.UseSqlServer(configuration.GetConnectionString("Default")));

services.AddSingleton<Query>();
services.AddSingleton<Schema>();

services.AddGraphQL();

Настроить

app.UseGraphQL<Schema>();

Запрос

    public class Query : ObjectGraphType
    {
        public Query(IServiceProvider resolver)
        {
            var db = resolver.GetRequiredService<Context>();

            Name = "query";
            Field<ListGraphType<Types.Note>>("notes", resolve: _ => db.Notes.AsAsyncEnumerable());
        }
    }

выполнение конечной точки GraphQL приводит к следующему исключению

System.InvalidOperationException: не удается разрешить ограниченную службу Models.Database.Context от корневого поставщика.

еще несколько деталей.


person 420skun    schedule 22.10.2019    source источник


Ответы (1)


Query и Schema также должны иметь область видимости, если он хочет воспользоваться преимуществом использования DbContext, который добавлен как область видимости по умолчанию.

services.AddDbContext<Context>(options => options.UseSqlServer(configuration.GetConnectionString("Default")));

services.AddScoped<Query>();
services.AddScoped<Schema>();

services.AddGraphQL()
    .AddGraphTypes(ServiceLifetime.Scoped);;

И Context должен быть явно введен

public class Query : ObjectGraphType {
    public Query(Context db) {
        Name = "query";
        Field<ListGraphType<Types.Note>>("notes", resolve: _ => db.Notes.AsAsyncEnumerable());
    }
}
person Nkosi    schedule 22.10.2019
comment
Вы можете рассмотреть this и это. Если вы используете тот же db в нескольких полях, вы получите исключение, потому что преобразователи выполняются параллельно, а DbContext EFC не выполняет многопоточные запросы. - person Granger; 12.03.2020