Как мне заполнить роли идентификации в ASP.NET Ядро 2.2 с использованием Script-Migration?

#asp.net-core #asp.net-core-identity #asp.net-core-2.2

#asp.net-core #asp.net-core-identity #asp.net-core-2.2

Вопрос:

Я использую миграции для создания и заполнения своей базы данных. Поскольку моя база данных запущена на отдельном сервере от моего веб-приложения, я использую Script-Migration для генерации сценария, который я могу запустить на сервере базы данных.

Согласно официальным документам EF Core, мы можем использовать HasData для настройки начальных данных для наших объектов. Есть ли способ сделать это с ролями идентификации или пользователями?

Ответ №1:

Для заполнения данных с помощью HasData обычно используется ваша собственная определенная модель.

Для заполнения данных для IdentityUser or IdentityRole рекомендуется использовать UserManager<IdentityUser> и RoleManager<IdentityRole> . Это связано с тем, что многие свойства могут быть неправильно установлены с помощью HasData like PasswordHash и ConcurrencyStamp .

Проверьте эту проблему Как заполнить ASP.NET Модель идентификации и связанные с ней вопросы о заполнении # 736

Комментарии:

1. Нет ли эквивалента кода, который я мог бы вставить в OnModelCreating мой DbContext, который выполняет то же действие, что и RoleManager<IdentityRole>.CreateAsync() ? Моя цель — полностью заполнить базу данных за одно действие. (т. Е. запустить один скрипт)

2. @Tony Не уверен, внимательно ли вы проверяете ссылку, если вы настаиваете на заполнении данных идентификации с помощью HasData , следуйте предложению

3. Извините, я не объяснил это ясно. Я имел в виду, что данные заполняются столбцами, такими как PasswordHash и ConcurrencyStamp , генерируемыми автоматически, аналогично тому, что сделал бы вызов RoleManager<IdentityRole>.CreateAsync() . Хотя из связанной проблемы, похоже, не существует такого метода, как упоминалось здесь .

Ответ №2:

Вы можете сделать это в методе OnModelCreating(). Обратите внимание, что ключи должны быть предопределены, чтобы избежать заполнения новых ролей при каждом выполнении метода. Приведенный ниже код создаст нового пользователя и новую роль и свяжет роль с пользователем:

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

        //Seeding a  'Administrator' role to AspNetRoles table
        modelBuilder.Entity<IdentityRole>().HasData(new IdentityRole {Id = "2c5e174e-3b0e-446f-86af-483d56fd7210", Name = "Administrator", NormalizedName = "ADMINISTRATOR".ToUpper() });


        //a hasher to hash the password before seeding the user to the db
        var hasher = new PasswordHasher<IdentityUser>();


        //Seeding the User to AspNetUsers table
        modelBuilder.Entity<IdentityUser>().HasData(
            new IdentityUser
            {
                Id = "8e445865-a24d-4543-a6c6-9443d048cdb9", // primary key
                UserName = "myuser",
                NormalizedUserName = "MYUSER",
                PasswordHash = hasher.HashPassword(null, "Pa$$w0rd")
            }
        );


        //Seeding the relation between our user and role to AspNetUserRoles table
        modelBuilder.Entity<IdentityUserRole<string>>().HasData(
            new IdentityUserRole<string>
            {
                RoleId = "2c5e174e-3b0e-446f-86af-483d56fd7210", 
                UserId = "8e445865-a24d-4543-a6c6-9443d048cdb9"
            }
        );
        

    }