从EFCore 2.1开始,可以使用DbContext OnModelCreating方法对数据进行种子设定。
https://docs.microsoft.com/en-us/ef/core/modeling/data-seeding
但是,用户/角色创建通常由UserManager / RoleManager处理。
现在,我可以手动创建角色或用户 - 但是例如在用户的情况下我需要自己散列密码(我不知道UserManager在没有深入挖掘源的情况下使用了什么散列方法)
有没有办法解决?或者我应该坚持使用像以前版本的Entity Framework Core一样在启动时运行的静态种子方法?
如果你想使用OnModelCreating
方法和HasData
方法,你可以这样做:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
ApplicationUser appUser = new ApplicationUser
{
UserName = "tester",
Email = "[email protected]",
NormalizedEmail = "[email protected]".ToUpper(),
NormalizedUserName = "tester".ToUpper(),
TwoFactorEnabled = false,
EmailConfirmed = true,
PhoneNumber = "123456789",
PhoneNumberConfirmed = false
};
PasswordHasher<ApplicationUser> ph = new PasswordHasher<ApplicationUser>();
appUser.PasswordHash = ph.HashPassword(appUser, "Your-PW1");
modelBuilder.Entity<IdentityRole>().HasData(
new IdentityRole { Name = "Admin", NormalizedName = "ADMIN" },
new IdentityRole { Name = "User", NormalizedName = "USER"}
);
modelBuilder.Entity<ApplicationUser>().HasData(
appUser
);
}
如果您在HasData
方法之外创建用户,则可以使用PasswordHasher
。它将为您散列密码。然后将创建的用户放入HasData
,而不是在那里创建一个新用户。我不知道这是否比启动时播种更好,但它是一种方法。