【问题标题】:UserRoles seeding failed用户角色播种失败
【发布时间】:2021-07-10 21:07:14
【问题描述】:

我正在开发一个 ASP.NET Core MVC Web 应用程序。我使用 Identity UI 框架进行用户授权和身份验证。

我已将所有 Identity 表的主键更改为“int”值(默认为字符串类型)

在以下代码中,我尝试将预定义的用户角色设置为“SuperAdmin”、“Admin”、“Businessman”和“WaterEnthusiast”,如下所示:

using Microsoft.AspNetCore.Identity;
using System.Linq;
using System.Threading.Tasks;
using WATERrhythmWeb.Models;

namespace WATERrhythmWeb.Data
{
    public class ContextSeed
    {
        public static async Task SeedRolesAsync(UserManager<WaterrhythmUser> userManager, RoleManager<IdentityRole> roleManager)
        {
            //Seed Roles
            await roleManager.CreateAsync(new IdentityRole(Enums.Roles.SuperAdmin.ToString()));
            await roleManager.CreateAsync(new IdentityRole(Enums.Roles.Admin.ToString()));
            await roleManager.CreateAsync(new IdentityRole(Enums.Roles.Businessman.ToString()));
            await roleManager.CreateAsync(new IdentityRole(Enums.Roles.WaterEnthusiast.ToString()));
        }
    }
}

以下是枚举:

public enum Roles
{
    SuperAdmin,
    Admin,
    Businessman,
    WaterEnthusiast
}

以下是我的 DBContext 类:

public partial class ApplicationDbContext : IdentityDbContext<WaterrhythmUser, IdentityRole<int>, int, IdentityUserClaim<int>, IdentityUserRole<int>, IdentityUserLogin<int>, IdentityRoleClaim<int>, IdentityUserToken<int>>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        builder.HasDefaultSchema("Identity");
        modelBuilder.Entity<WaterrhythmUser>(entity =>
        {
            entity.ToTable(name: "User");
        });
        modelBuilder.Entity<IdentityRole>(entity =>
        {
            entity.ToTable(name: "WATERrhythmRole");
        });
        modelBuilder.Entity<IdentityUserRole<int>>(entity =>
        {
            entity.ToTable("WATERrhythmUserRoles");
        });

        modelBuilder.Entity<IdentityUserClaim<int>>(entity =>
        {
            entity.ToTable("WATERrhythmUserClaims");
        });

        modelBuilder.Entity<IdentityUserLogin<int>>(entity =>
        {
            entity.ToTable("WATERrhythmUserLogins");
        });

        modelBuilder.Entity<IdentityRoleClaim<int>>(entity =>
        {
            entity.ToTable("WATERrhythmRoleClaims");

        });

        modelBuilder.Entity<IdentityUserToken<int>>(entity =>
        {
            entity.ToTable("WATERrhythmUserTokens");
        });
    }
}

根据教程,经过上述修改后,当我运行应用程序时,上面定义的用户角色应该在数据库表中播种:'IdentityRole'。

但当我运行应用程序(已创建迁移并更新新数据库)时,它不会创建任何用户角色。

有人可以告诉我如何纠正这个问题吗?

谢谢。

(如您所见,我已将这些表的主键更改为“int”。我很好奇它是否会导致此问题。)

【问题讨论】:

    标签: asp.net-mvc asp.net-core asp.net-identity user-roles asp.net-roles


    【解决方案1】:

    但是当我运行应用程序(已创建迁移并更新新数据库)时,它不会创建任何用户角色。

    听起来您可能忘记在任何地方调用SeedRolesAsync

    如果不是这样,我看到了一些可能会引起一些麻烦的事情。在您的配置中,您正在为 IdentityRole 进行配置,但在 DbContext 中,您有 IdentityRole&lt;int&gt;。即使在您的播种方法中,也没有&lt;int&gt;,而是默认IdentityRole。您应该将每个IdentityRole 更改为IdentityRole&lt;int&gt;

    但是,我认为为此类字典表播种的更清洁的解决方案是使用 EF Core 的流式 API 的 HasData。在您的情况下,它可能看起来像这样:

    modelBuilder.Entity<IdentityRole<int>>(entity =>
    {
        entity.ToTable(name: "WATERrhythmRole");
        entity.HasData(
            new IdentityRole<int>
            {
                Id = 1,
                Name = Roles.SuperAdmin.ToString(),
                NormalizedName = Roles.SuperAdmin.ToString().ToUpper()
            },
            new IdentityRole<int>
            {
                Id = 2,
                Name = Roles.Admin.ToString(),
                NormalizedName = Roles.Admin.ToString().ToUpper()
            }
        );
    });
    

    这样就没有理由创建一个额外的方法并从某个地方运行它来为数据库播种。

    【讨论】:

    • 是的,你是对的。通过将 IdentityRole 更改为 IdentityRole,它解决了这个问题。非常感谢您的明确解释。 (我已经在我的 program.cs 中调用了调用 SeedRolesAsync。)
    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多