【发布时间】:2020-09-13 16:15:36
【问题描述】:
我正在改变使用 entiy 框架核心在我的应用程序上播种数据的方式。在 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;
}
}
程序文件
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.");
}
}
现在我想在 2.1 版之后开始使用它
public static class ModelBuilderExtensions
{
public static void Seed(this ModelBuilder modelBuilder)
{
modelBuilder.Entity<Author>().HasData(
new Author
{
AuthorId = 1,
FirstName = "William",
LastName = "Shakespeare"
}
);
modelBuilder.Entity<Book>().HasData(
new Book { BookId = 1, AuthorId = 1, Title = "Hamlet" },
new Book { BookId = 2, AuthorId = 1, Title = "King Lear" },
new Book { BookId = 3, AuthorId = 1, Title = "Othello" }
);
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Seed();
}
【问题讨论】:
标签: c# asp.net-core entity-framework-core