#asp.net-core #entity-framework-core #asp.net-identity #asp.net-core-5.0
Вопрос:
Я получаю недопустимое имя объекта исключения «AspNetRoles». когда я пытаюсь ввести значения при запуске приложения. Я полагаю, что это связано с тем, что я создал пользовательскую конфигурацию, которая переименовала таблицы идентификаторов, используя этот подход: я должен отметить, что я использовал подход code first.
public static void AddCustomIdentityConfiguration(this ModelBuilder builder) { builder.Entity<ApplicationUser>().ToTable("users"); //AspNetUsers builder.Entity<IdentityRole>().ToTable("roles"); //AspNetRoles builder.Entity<IdentityUserRole<string>>().ToTable("user_roles"); //AspNetUserRole builder.Entity<IdentityUserClaim<string>>().ToTable("user_claims"); //AspNetUserClaim builder.Entity<IdentityUserLogin<string>>().ToTable("user_login"); //AspNetUserLogin builder.Entity<IdentityRoleClaim<string>>().ToTable("role_claim"); //AspNetRoleClaim builder.Entity<IdentityUserToken<string>>().ToTable("user_token"); //AspNetUserToken }
Я создал простой статический метод, который должен выполнять посев
public static async Task SeedDBDefaultRolesAsync(RoleManager<IdentityRole> roleManager) { if (!roleManager.Roles.Any()) { var roles = new List<RoleDTO>() { new RoleDTO() { Name = "Admin", NormalizedName = "ADMIN"}, new RoleDTO() { Name = "User", NormalizedName = "USER"}, }; foreach (var role in roles) { await roleManager.CreateAsync(role); } } }
Итак, мой вопрос заключается в следующем: как я могу получить доступ к таблице ролей вместо таблицы AspNetRoles?
ОБНОВЛЕНИЕ: Конфигурация AddCustomIdentityConfiguration запускается при переносе дополнений. Он был создан с первоначальной миграцией
Пример миграции..
....migrationBuilder.CreateTable( name: "users", columns: table => new { Id = table.Column<string>(type: "nvarchar(450)", nullable: false), UserName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), NormalizedUserName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), Email = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), NormalizedEmail = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), EmailConfirmed = table.Column<bool>(type: "bit", nullable: false), PasswordHash = table.Column<string>(type: "nvarchar(max)", nullable: true), SecurityStamp = table.Column<string>(type: "nvarchar(max)", nullable: true), ConcurrencyStamp = table.Column<string>(type: "nvarchar(max)", nullable: true), PhoneNumber = table.Column<string>(type: "nvarchar(max)", nullable: true), PhoneNumberConfirmed = table.Column<bool>(type: "bit", nullable: false), TwoFactorEnabled = table.Column<bool>(type: "bit", nullable: false), LockoutEnd = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true), LockoutEnabled = table.Column<bool>(type: "bit", nullable: false), AccessFailedCount = table.Column<int>(type: "int", nullable: false) }, constraints: table => { table.PrimaryKey("PK_users", x => x.Id); });
Комментарии:
1. Где называется этот
AddCustomIdentityConfiguration
метод? При правильном вызове вам больше ничего не нужно делать, чтобы получить доступ к «переименованной» таблице.2. @IvanStoev Я обновил вопрос. В основном это было вызвано первоначальной миграцией
3. Я имею в виду, где этот метод вызывается в вашем коде . т. е. изнутри
OnModelCreating
, до или после базового вызова (в случае, если вы наследуете один из базовых универсальныхIdentityDbContext
)4. Это называется внутри OnModelCreating
protected override void OnModelCreating(ModelBuilder builder) { builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); base.OnModelCreating(builder); builder.AddCustomIdentityConfiguration(); }
5. Хм, тогда это должно сработать. За исключением случаев
RoleManager
, когда класс, который вы передаете, не использует контекст вашей бд (с вышеупомянутымOnModelCreating
переопределением).