Попытка добавить роль запрашивает «AspNetRoles» вместо «AspNetUserRoles» - PullRequest
0 голосов
/ 06 ноября 2019

Я работаю над проектом, использую подход, основанный на коде, и использую ASP .NET Core 3.0 и Entity Framework Core & Identity 3.0.0. Я определил свои права и хотел бы создать два IdentityRoles, один как Customer, а другой как Administrator. Для этого я подготовил следующий метод:

  public static IServiceProvider ConfigureDefaultRoles(this IServiceProvider serviceProvider)
    {
        //TODO: figure out why the table is incorrectly named
        var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole<Guid>>>();
        var defaultUserRoles = new List<IdentityRole<Guid>>
        {
            new IdentityRole<Guid>() {Name = UserRoleDefinitions.CustomerRoleName},
            new IdentityRole<Guid>() {Name = UserRoleDefinitions.AdministratorRoleName}
        };

        foreach (var role in defaultUserRoles)
        {
            if (roleManager.RoleExistsAsync(role.Name).Result)
            {
                continue;
            }

            roleManager.CreateAsync(role);
        }

        return serviceProvider;
    }

Этот метод вызывается Startup следующим образом:

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
        app.ConfigureApplication();
        serviceProvider.ConfigureDefaultRoles();
    }

При запуске это приводит к следующему ошибка . Основная проблема заключается в том, что менеджер ролей пытается запросить таблицу AspNetRoles вместо AspNetUserRoles. Я убедился, что миграции были применены. Мой контекст БД выглядит следующим образом:

 public class ApplicationDbContext : IdentityDbContext<User, IdentityRole<Guid>, Guid>, IDbContext
    {
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="options">The options for the application context builder</param>
        public ApplicationDbContext(DbContextOptions options)
            : base(options)
        {
        }

        /// <summary>
        /// Apply the entity configurations defined in 'Configurations'.
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Call the base
            base.OnModelCreating(modelBuilder);

            // Apply the configurations defined in 'Configurations'
            modelBuilder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly);
        }
    }

В этом проекте нет реализованных ролей, я использую IdentityRole<Guid>. Идентификация настраивается следующим образом:

public static IServiceCollection ConfigureIdentity(this IServiceCollection services)
{
    services
        .AddIdentity<User, IdentityRole<Guid>>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    return services;
}

Мой User выглядит следующим образом: User : IdentityUser<Guid>. Кроме того, я взглянул на ApplicationDbContextModelSnapshot и заметил, что действительно таблица AspNetRoles объявлена ​​как использующая именованную ошибку, которой нет, но таблица перестроена под именем AspNetUserRoles. Изучение файла базы данных (app.db для разработки) показывает только AspNetUserRoles. Полный снимок доступен здесь .

    modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole<System.Guid>", b =>
                {
                    b.Property<Guid>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("TEXT");

                    b.Property<string>("ConcurrencyStamp")
                        .IsConcurrencyToken()
                        .HasColumnType("TEXT");

                    b.Property<string>("Name")
                        .HasColumnType("TEXT")
                        .HasMaxLength(256);

                    b.Property<string>("NormalizedName")
                        .HasColumnType("TEXT")
                        .HasMaxLength(256);

                    b.HasKey("Id");

                    b.HasIndex("NormalizedName")
                        .IsUnique()
                        .HasName("RoleNameIndex");

                    b.ToTable("AspNetRoles");
                });


modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<System.Guid>", b =>
                {
                    b.Property<Guid>("UserId")
                        .HasColumnType("TEXT");

                    b.Property<Guid>("RoleId")
                        .HasColumnType("TEXT");

                    b.HasKey("UserId", "RoleId");

                    b.HasIndex("RoleId");

                    b.ToTable("AspNetUserRoles");
                });

Очевидно, мне не хватает точки ..

Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2019

Как сказал @IVan, обе таблицы действительно существовали. Проблема заключалась в том, что у меня был конструктор контекста, который указывал на источник данных, расположенный в проекте «Постоянство». Однако WebUI пытался получить доступ к тому же источнику данных из своего каталога проекта. Это привело к созданию нового источника данных без каких-либо таблиц или миграций.

Мне удалось это исправить, переключившись на SQLServer (локальный db) для разработки.

...