Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 用户角色种子设定失败_Asp.net Mvc_Asp.net Core_Asp.net Identity_User Roles_Asp.net Roles - Fatal编程技术网

Asp.net mvc 用户角色种子设定失败

Asp.net mvc 用户角色种子设定失败,asp.net-mvc,asp.net-core,asp.net-identity,user-roles,asp.net-roles,Asp.net Mvc,Asp.net Core,Asp.net Identity,User Roles,Asp.net Roles,我正在开发一个ASP.NET核心MVC web应用程序。我使用Identity UI框架进行用户授权和身份验证 我已将所有标识表的主键更改为“int”值(默认为字符串类型) 在下面的代码中,我尝试将预定义的用户角色作为“超级管理员”、“管理员”、“商人”和“水爱好者”,如下所示: using Microsoft.AspNetCore.Identity; using System.Linq; using System.Threading.Tasks; using WATERrhythmWeb.Mo

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

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

在下面的代码中,我尝试将预定义的用户角色作为“超级管理员”、“管理员”、“商人”和“水爱好者”,如下所示:

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()));
        }
    }
}
下面是我的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");
        });
    }
}
public分部类ApplicationDbContext:IdentityDbContext
{
公共应用程序DBContext(DbContextOptions

根据教程,在进行上述修改之后,当我运行应用程序时,上面定义的用户角色应该被植入数据库表中:“IdentityRole”

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

有人能告诉我如何纠正这个问题吗

多谢各位

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

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

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

如果不是这样的话,我会看到一些可能会引起一些问题的东西。在您的配置中,您正在为
IdentityRole
进行配置,但在DbContext中,您有
IdentityRole
。即使在种子设定方法中,也没有
而是默认的
IdentityRole
。您应该将每个
IdentityRole
更改为
IdentityRole

然而,我认为一个更干净的解决方案是使用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()
        }
    );
});
modelBuilder.Entity(Entity=>
{
实体。ToTable(名称:“角色”);
entity.HasData(
新身份证
{
Id=1,
Name=Roles.SuperAdmin.ToString(),
NormalizedName=Roles.SuperAdmin.ToString().ToUpper()
},
新身份证
{
Id=2,
Name=Roles.Admin.ToString(),
NormalizedName=Roles.Admin.ToString().ToUpper()
}
);
});

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

是的,您是正确的。通过将IdentityRole更改为IdentityRole,它解决了问题。非常感谢您的明确解释。(我已经在我的程序.cs中调用了invoke
SeedRolesAsync
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()
        }
    );
});