2017-01-29 4 views
1

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

SqlException: Invalid object name 'OpenIddictTokens'. System.Data.SqlClient.SqlCommand+<>c.b__107_0(Task result)

DbUpdateException: An error occurred while updating the entries. See the inner exception for details. Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch+d__32.MoveNext()

Чтобы подтвердить то, что это выход из окна вывода:

INSERT INTO [OpenIddictTokens] ([ApplicationId], [AuthorizationId], [Subject], [Type]) VALUES (@p0, @p1, @p2, @p3); SELECT [Id] FROM [OpenIddictTokens] WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity(); Exception thrown: 'System.Data.SqlClient.SqlException' in Microsoft.EntityFrameworkCore.Relational.dll

я замечаю там не одна таблица OpenIddict в базе данных. Существует много примеров использования OpenIddictDbContext: but there is a new approach, который я использую, но что-то не работает.

Мой файл стартап:

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 

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

ответ

1

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

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

    modelBuilder.UseOpenIddict<int>(); 

    //fix table names 
+0

мне пришлось пропустить , поскольку я использую модель идентификации по умолчанию, но ваш ответ заставил меня там. :) –