#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"
}
);
}