Code First Seed Asp.net 身份

Code First Seed Asp.net Identity

我正在处理一个项目的新需求,该项目已经存在了 months.I 年,我正在使用具有 Asp.net 身份的 Code First (EF6)。我需要在种子方法中添加一个新的用户角色并将这个角色附加到管理员。 如何为种子中的管理员添加新角色? 下面是我的种子方法的代码片段。

 protected override void Seed(myDbContext context)
    {
if (!context.Roles.Any())
        {
            var userManager =
                new UserManager<AppUser, Guid>(
                    new UserStore<AppUser, AppRole, Guid, AppUserLogin, AppUserRole, AppUserClaim>(context));
            var roleManager = new RoleManager<AppRole, Guid>(new RoleStore<AppRole, Guid, AppUserRole>(context));

            var adminRole = new AppRole() {Name = "admin"};
            roleManager.Create(adminRole);


            var admin = new Admin()
            {
                UserName = "test@test.com",
                EmailConfirmed = true,
                SecurityStamp = Guid.NewGuid().ToString()
            };
            admin.Roles.Add(new AppUserRole()
            {
                RoleId = adminRole.Id
            });


            userManager.Create(admin, "pwd");

            // user.Roles.Add(new IdentityUserRole { RoleId = userRole.Id, UserId = user.Id });

            base.Seed(context);
        }

    }

简单。添加了一个 else if 条件并创建了一个新角色

如果您有一个实时应用程序并且有一个 运行 迁移,那么您的代码将无法工作,因为 !context.Roles.Any() 将是错误的,因为您现在有角色。要使您的脚本幂等,请执行以下操作:

protected override void Seed(myDbContext context)
{

    var userManager = new UserManager<AppUser, Guid>(new UserStore<AppUser, AppRole, Guid, AppUserLogin, AppUserRole, AppUserClaim>(context));
    var roleManager = new RoleManager<AppRole, Guid>(new RoleStore<AppRole, Guid, AppUserRole>(context));

    // see if this role exists -- repeat for all roles
    if (!context.Roles.Any(r => r.Name == "admin"))
    {
        var adminRole = new AppRole() {Name = "admin"};
        roleManager.Create(adminRole);
    }

    // see if the user exists -- repeat for all users
    if (!context.Users.Any(u => u.UserName == "test@test.com")
    {
        var admin = new Admin()
        {
            UserName = "test@test.com",
            EmailConfirmed = true,
            SecurityStamp = Guid.NewGuid().ToString()
        };
        userManager.Create(admin, "pwd");
    }

    // see if the user has the role -- repeat for all roles for user, all users
    if (!userManager.IsInRole(admin.Id, "admin")
    {
         userManager.AddToRole(admin.Id, "admin")
    }

    ...

    base.Seed(context);

}