Asp.net mvc 用户角色种子设定失败
我正在开发一个ASP.NET核心MVC web应用程序。我使用Identity UI框架进行用户授权和身份验证 我已将所有标识表的主键更改为“int”值(默认为字符串类型) 在下面的代码中,我尝试将预定义的用户角色作为“超级管理员”、“管理员”、“商人”和“水爱好者”,如下所示: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
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中调用了invokeSeedRolesAsync
)
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()
}
);
});