Хранилища удостоверений с фабрикой контекста БД

В моем проекте ASP.NET Core 5.0 я изменил

services.AddDbContext<SelfProgressDbContext>(...);

to

services.AddPooledDbContextFactory<SelfProgressDbContext>(...);

и теперь приложение не запускается. Подмножество ошибок, которые я получил:

Ошибка при проверке дескриптора службы «ServiceType: Microsoft.AspNetCore.Identity.UserManager1[SelfProgress.Domain.User] Lifetime: Scoped ImplementationType: Microsoft.AspNetCore.Identity.UserManager1[SelfProgress.Domain.User]»: невозможно разрешить службу для типа «SelfProgress.Orm.SelfProgressDbContext» при попытке активировать › «Microsoft.AspNetCore.Identity. EntityFrameworkCore.UserStore9[SelfProgress.Domain.User,Microsoft.AspNetCore.Identity.IdentityRole1[System.Guid],SelfProgress.Orm.SelfProgressDbContext,System.Guid,Microsoft.AspNetCore.Identity.IdentityUserClaim1[System.Guid],Microsoft.AspNetCore.Identity.IdentityUserRole1[System.Guid],Microsoft.AspNetCore.Identity.IdentityUserLogin1[System.Guid],Microsoft.AspNetCore.Identity.IdentityUserToken1[System.Guid],Microsoft.AspNetCore.Identity .IdentityRoleClaim`1[System.Guid]]’.

Ошибка при проверке дескриптора службы "ServiceType: Microsoft.AspNetCore.Identity.ISecurityStampValidator Lifetime: Scoped RegistrationType: Microsoft.AspNetCore.Identity.SecurityStampValidator1[SelfProgress.Domain.User]': Unable to resolve service for type 'SelfProgress.Orm.SelfProgressDbContext' while attempting to activate 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore9[SelfProgress.Domain.User,Microsoft.AspNetCore.Identity.IdentityRole1[System.Guid],SelfProgress.Orm.SelfProgressDbContext,System.Guid,Microsoft.AspNetCore.Identity.IdentityUserClaim1[System.Guid],Microsoft. AspNetCore.Identity.IdentityUserRole1[System.Guid],Microsoft.AspNetCore.Identity.IdentityUserLogin1[System.Guid],Microsoft.AspNetCore.Identity.IdentityUserToken1[System.Guid],Microsoft.AspNetCore.Identity.IdentityRoleClaim1[System.Guid]]».

Ошибка при проверке дескриптора службы «ServiceType: Microsoft.AspNetCore.Identity.RoleManager1[Microsoft.AspNetCore.Identity.IdentityRole1[System.Guid]] Срок службы: Scoped RegistrationType: Microsoft.AspNetCore.Identity.RoleManager1[Microsoft.AspNetCore.Identity.IdentityRole1[System.Guid]]»: невозможно разрешить службу для типа «SelfProgress .Orm.SelfProgressDbContext» при попытке активировать «Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore5[Microsoft.AspNetCore.Identity.IdentityRole1[System.Guid],SelfProgress.Orm.SelfProgressDbContext,System.Guid,Microsoft.AspNetCore.Identity.IdentityUserRole1[System.Guid],Microsoft.AspNetCore.Identity.IdentityRoleClaim1[System.Guid]]».

Похоже, что классы хранилища Identity EF больше не могут разрешать контекст БД из-за новой регистрации фабрики контекста БД в пуле. Использование AddPooledDbContextFactory кажется, что вы больше не можете напрямую разрешать контекст БД. Вместо этого вы должны разрешить фабрику, а затем вручную создать контекст БД.

Регистрация моей личности:

services
    .AddIdentity<User, IdentityRole<Guid>>(...)
    .AddEntityFrameworkStores<SelfProgressDbContext>()
    .AddDefaultTokenProviders()

Есть ли способ заставить хранилища удостоверений по умолчанию разрешать контекст БД через новую фабрику?


person Vladislav Tryhub    schedule 13.03.2021    source источник


Ответы (1)


В ConfigureServices попробуйте использовать метод AddScoped() для регистрации DBContext и используйте провайдера для получения фабрики из сервисов. Затем верните экземпляр поставщику. Такой код:

        services.AddDbContextFactory<ApplicationDbContext>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
            options.EnableSensitiveDataLogging();
        });

        services.AddScoped<ApplicationDbContext>(p => p.GetRequiredService<IDbContextFactory<ApplicationDbContext>>().CreateDbContext());

ApplicationDbContext.cs:

public class ApplicationDbContext : IdentityDbContext
{
     ...
}
person Zhi Lv    schedule 06.04.2021
comment
Вы также можете использовать services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connectionString));... Вы не знаете, есть ли другой способ? Возможно, пользовательское расширение IdentityBuilder? - person suchoss; 20.04.2021