C# 在实体框架核心3中播种用户和角色

C# 在实体框架核心3中播种用户和角色,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我正在改变使用Enty framework core在应用程序上播种数据的方式。在2.1版之前,您无法设置标识键值,因此我开始迁移代码,但现在我在从标识中设置用户和角色种子时遇到问题。如何访问DbContext文件或modelbinder扩展名上的userManager或RoleManager 下面是我如何使用类为用户和角色播种种子,并将其注入program.cs public class DbInitializer { public static async Task Seed(App

我正在改变使用Enty framework core在应用程序上播种数据的方式。在2.1版之前,您无法设置标识键值,因此我开始迁移代码,但现在我在从标识中设置用户和角色种子时遇到问题。如何访问DbContext文件或modelbinder扩展名上的userManager或RoleManager

下面是我如何使用类为用户和角色播种种子,并将其注入program.cs

public class DbInitializer
{
    public static async Task Seed(ApplicationDbContext context, UserManager<User> userManager, RoleManager<Role> roleManager)
    {
        #region Identity
        string[] roles = new string[] { "Developer", "Super Administrator", "Administrator", "User" };

        foreach (string role in roles)
        {
            if (!context.Roles.Any(r => r.Name == role))
            {
                await roleManager.CreateAsync(new Role(role));
            }
        }


        var user = new User
        {
            Name = "test",                
            Email = "test@test.com",
            NormalizedEmail = "TEST@TEST.COM",
            UserName = "test",
            NormalizedUserName = "TEST",                
            EmailConfirmed = true,
            PhoneNumberConfirmed = false,
            SecurityStamp = Guid.NewGuid().ToString("D")
        };


        if (!context.Users.Any(u => u.UserName == user.UserName))
        {
            var password = new PasswordHasher<User>();
            var hashed = password.HashPassword(user, "development");
            user.PasswordHash = hashed;

            var result = await userManager.CreateAsync(user);

        }

        await AssignRoles(userManager, user.UserName, roles);
        #endregion           
    }

    public static async Task<IdentityResult> AssignRoles(UserManager<User> userManager, string userName, string[] roles)
    {            
        User user = await userManager.FindByNameAsync(userName);
        var result = await userManager.AddToRolesAsync(user, roles);

        return result;
    }
}
公共类DbInitializer
{
公共静态异步任务种子(ApplicationDbContext上下文、UserManager UserManager、RoleManager RoleManager)
{
#地域认同
字符串[]角色=新字符串[]{“开发人员”、“超级管理员”、“管理员”、“用户”};
foreach(角色中的字符串角色)
{
if(!context.Roles.Any(r=>r.Name==role))
{
等待roleManager.CreateAsync(新角色(Role));
}
}
var user=新用户
{
Name=“test”,
电子邮件=”test@test.com",
标准化邮件=”TEST@TEST.COM",
UserName=“test”,
NormalizedUserName=“测试”,
emailconfirm=true,
PhoneNumberConfiged=false,
SecurityStamp=Guid.NewGuid().ToString(“D”)
};
如果(!context.Users.Any(u=>u.UserName==user.UserName))
{
var password=new PasswordHasher();
var hashed=password.HashPassword(用户,“开发”);
user.PasswordHash=散列;
var result=await userManager.CreateAsync(用户);
}
等待分配角色(userManager、user.UserName、roles);
#端区
}
公共静态异步任务分配角色(UserManager UserManager、字符串用户名、字符串[]角色)
{            
User User=await userManager.FindByNameAsync(用户名);
var result=await userManager.AddToRolesAsync(用户、角色);
返回结果;
}
}
程序文件

        var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        var isDevelopment = environment == Environments.Development;

        if (isDevelopment)
        {
            using var scope = host.Services.CreateScope();
            var services = scope.ServiceProvider;
            try
            {
                var context = services.GetRequiredService<ApplicationDbContext>();
                var roleManager = services.GetRequiredService<RoleManager<Role>>();
                var userManager = services.GetRequiredService<UserManager<User>>();
                await DbInitializer.Seed(context, userManager, roleManager);//<---Do your seeding here
            }
            catch (Exception ex)
            {
                Log.Error(ex, "An error occurred while seeding the database.");
            }
        }
var-environment=environment.GetEnvironmentVariable(“ASPNETCORE_-environment”);
var isDevelopment=environment==Environments.Development;
if(ISD开发)
{
使用var scope=host.Services.CreateScope();
var services=scope.ServiceProvider;
尝试
{
var context=services.GetRequiredService();
var rolemager=services.GetRequiredService();
var userManager=services.GetRequiredService();

等待DbInitializer.Seed(上下文、用户管理器、角色管理器);//如果从
IdentityDbContext
继承,则可以通过

modelBuilder.Entity<Users>().HasData(
            new User
            {
            }
modelBuilder.Entity().HasData(
新用户
{
}
modelBuilder.Entity<Users>().HasData(
            new User
            {
            }