Asp.net core 是否可以/建议使用EFCore 2.1数据种子设定系统为用户/角色设定种子?

Asp.net core 是否可以/建议使用EFCore 2.1数据种子设定系统为用户/角色设定种子?,asp.net-core,entity-framework-core,Asp.net Core,Entity Framework Core,从EFCore 2.1开始,可以使用DbContext OnModelCreating方法对数据进行种子设定 但是,用户/角色创建通常由用户经理/角色管理员处理 现在,我可以手动创建一个角色或用户,但例如,对于一个用户,我需要自己对密码进行散列(如果不深入源代码,我不知道UserManager使用什么散列方法) 这有什么办法吗?或者我应该坚持使用在启动时运行的静态种子设定方法,就像以前版本的Entity Framework Core一样?如果您想将OnModelCreating方法与HasDa

从EFCore 2.1开始,可以使用DbContext OnModelCreating方法对数据进行种子设定

但是,用户/角色创建通常由用户经理/角色管理员处理

现在,我可以手动创建一个角色或用户,但例如,对于一个用户,我需要自己对密码进行散列(如果不深入源代码,我不知道UserManager使用什么散列方法)


这有什么办法吗?或者我应该坚持使用在启动时运行的静态种子设定方法,就像以前版本的Entity Framework Core一样?

如果您想将
OnModelCreating
方法与
HasData
方法结合使用,您可以这样做:

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

        ApplicationUser appUser = new ApplicationUser
        {
            UserName = "tester",
            Email = "tester@test.com",
            NormalizedEmail = "tester@test.com".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
        );
    }
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
ApplicationUser appUser=新的ApplicationUser
{
UserName=“tester”,
电子邮件=”tester@test.com",
标准化邮件=”tester@test.com“.ToUpper(),
NormalizedUserName=“tester”.ToUpper(),
TwoFactorEnabled=false,
emailconfirm=true,
PhoneNumber=“123456789”,
PhoneNumber确认=错误
};
PasswordHasher ph=新的PasswordHasher();
appUser.PasswordHash=ph.HashPassword(appUser,“Your-PW1”);
modelBuilder.Entity().HasData(
新的IdentityRole{Name=“Admin”,NormalizedName=“Admin”},
新的IdentityRole{Name=“User”,NormalizedName=“User”}
);
modelBuilder.Entity().HasData(
应用程序用户
);
}
如果在
HasData
方法之外创建用户,则可以使用
PasswordHasher
。 它将为您散列密码。然后将创建的用户放入
HasData
,而不是在那里创建一个新用户。
我不知道这是否比启动时播种好,但这是一种方法。

这确实比启动时播种好。正如微软所说,播种代码不应该是正常应用程序执行的一部分,但他们也说
.HasData()
不应用于需要调用外部API的
数据,例如ASP.NET核心身份角色和用户创建