SqlException: недопустимое имя объекта 'OpenIddictTokens'

Когда я пытаюсь войти в систему, я получаю сообщение об ошибке: во время обработки запроса произошло необработанное исключение.

SqlException: Неверное имя объекта 'OpenIddictTokens'. System.Data.SqlClient.SqlCommand+<>c.b__107_0(Результат задачи)

DbUpdateException: произошла ошибка при обновлении записей. Смотрите внутреннее исключение для деталей. Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch+d__32.MoveNext()

Чтобы подтвердить вещи, это выводится из окна вывода:

INSERT INTO [OpenIddictTokens] ([ApplicationId], [AuthorizationId], [Subject], [Type]) VALUES (@ p0, @ p1, @ p2, @ p3); ВЫБРАТЬ [Id] ИЗ [OpenIddictTokens] WHERE @@ROWCOUNT = 1 И [Id] = scope_identity(); Исключение: "System.Data.SqlClient.SqlException" в Microsoft.EntityFrameworkCore.Relational.dll

Я заметил, что в базе данных нет ни одной таблицы OpenIddict. Существует множество примеров использования OpenIddictDbContext, но я использую новый подход, но что-то не работает.

Мой файл запуска:

public void ConfigureServices(IServiceCollection services)
{
    try
    {
        services.AddMvc();

        services.AddEntityFrameworkSqlServer();

        services.AddScoped<UserStore<AppUser, AppRole, AppDbContext, int, AppUserClaim, AppUserRole, AppUserLogin, AppUserToken, AppRoleClaim>, AppUserStore>();
        services.AddScoped<UserManager<AppUser>, AppUserManager>();
        services.AddScoped<RoleManager<AppRole>, AppRoleManager>();
        services.AddScoped<SignInManager<AppUser>, AppSignInManager>();
        services.AddScoped<RoleStore<AppRole, AppDbContext, int, AppUserRole, AppRoleClaim>, AppRoleStore>();

        var connection = Configuration["ConnectionStrings"];
        services.AddDbContext<AppDbContext>(options => {
            options.UseSqlServer(connection);
            options.UseOpenIddict<int>();
        });

        services
            .AddIdentity<AppUser, AppRole>()
            .AddUserStore<AppUserStore>()
            .AddUserManager<AppUserManager>()
            .AddRoleStore<AppRoleStore>()
            .AddRoleManager<AppRoleManager>()
            .AddSignInManager<AppSignInManager>()
            .AddDefaultTokenProviders();

        services.AddOpenIddict<int>()
            .AddEntityFrameworkCoreStores<AppDbContext>()
            .AddMvcBinders()
            .EnableTokenEndpoint("/API/authorization/token")
            .AllowPasswordFlow()
            .AllowRefreshTokenFlow()
            .DisableHttpsRequirement();

        services.AddSingleton<DbSeeder>();

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        throw;
    }
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, DbSeeder dbSeeder)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
        {
            HotModuleReplacement = true
        });
    }
    else
    {

    }

    app.UseStaticFiles();

    app.UseIdentity();

    app.UseOpenIddict();

    app.UseOAuthValidation();

    app.UseMvc();

    try
    {

        dbSeeder.SeedAsync();
    }
    catch (AggregateException e)
    {
        throw new Exception(e.ToString());
    }
}

}

и мой DbContext:

public partial class AppDbContext : IdentityDbContext<AppUser, AppRole, int, AppUserClaim, AppUserRole, AppUserLogin, AppRoleClaim, AppUserToken>
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //fix table names
        modelBuilder.Entity<AppUser>(b =>
        {
            b.ToTable("Users");
        });

        modelBuilder.Entity<AppRole>(b =>
        {
            b.ToTable("Roles");
        });

        modelBuilder.Entity<AppUserClaim>(b =>
        {
            b.ToTable("UserClaims");
        });

        modelBuilder.Entity<AppRoleClaim>(b =>
        {
            b.ToTable("RoleClaims");
        });

        modelBuilder.Entity<AppUserRole>(b =>
        {
            b.ToTable("UserRoles");
        });

        modelBuilder.Entity<AppUserLogin>(b =>
        {
            b.ToTable("UserLogins");
        });

        modelBuilder.Entity<AppUserToken>(b =>
        {
            b.ToTable("UserTokens");
        });


        //add our

Я перезаписываю все свои классы идентификации (IdentityRole, IdentityRoleClaim, IdentityUser ...) для использования <int> как TKey.

Я не знаю, почему таблицы OpenIdDict не создаются. Я уже сбрасываю свою базу данных, создаю новую и запускаю

dotnet ef migrations add "Initial" -o "Data\Migrations"
dotnet ef database update

, но создаются только таблицы идентичности.

2 ответа

Решение

Это помогает (таблицы создаются), если я звоню modelBuilder.UseOpenIddict<int>():

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.UseOpenIddict<int>();

    //fix table names

Сделайте это в консоли диспетчера пакетов:

add-migration

а потом

update-database

он должен исправить ошибку

См. Строку подключения в классе "startup.cs" и в файле конфигурации "appsettings.json". В моем случае было имя экземпляра SQL Server Express.

Другие вопросы по тегам