UserRoles 播种失败

UserRoles seeding failed

我正在开发 ASP.NET 核心 MVC 网络应用程序。我使用 Identity UI 框架进行用户授权和身份验证。

我已经将所有Identity table的主键更改为'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 class:

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");
        });
    }
}

根据教程,经过以上修改,当我运行应用上面定义的用户角色应该在数据库中播种table:'IdentityRole'.

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

有人可以告诉我如何解决这个问题吗?

谢谢。

(如您所见,我已将 table 的主键更改为 'int'。我想知道是否会导致此问题。)

But when I run the application (having created the migrations and update the new database), it does not create any user roles.

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

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

但是,我认为使用 EF Core 的 fluent 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()
        }
    );
});

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