【问题标题】:Seeding Users and Roles in Entity Framework Core 3在 Entity Framework Core 3 中播种用户和角色
【发布时间】: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


    【解决方案1】:

    如果你继承自IdentityDbContext,那么你可以通过

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

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 2020-05-23
      • 2021-06-30
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 2012-11-13
      相关资源
      最近更新 更多