C# 在实体框架核心3中播种用户和角色
我正在改变使用Enty framework core在应用程序上播种数据的方式。在2.1版之前,您无法设置标识键值,因此我开始迁移代码,但现在我在从标识中设置用户和角色种子时遇到问题。如何访问DbContext文件或modelbinder扩展名上的userManager或RoleManager 下面是我如何使用类为用户和角色播种种子,并将其注入program.csC# 在实体框架核心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
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
{
}