我正在开发一个ASP.NET Core MVC web应用程序。我使用Identity UI框架进行用户授权和身份验证。
我已将所有Identity表的主键更改为"int"值(默认情况下为字符串类型(
在下面的代码中,我试图将预定义的用户角色设置为"SuperAdmin"、"Admin"、《Businessman》和"WaterEnthusist",如下所示:
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");
});
}
}
- 我遵循了本教程:https://codewithmukesh.com/blog/user-management-in-aspnet-core-mvc/
根据教程,在进行上述修改后,当我运行应用程序时,上面定义的用户角色应该在数据库表中播种:"IdentityRole"。
但是当我运行应用程序(创建了迁移并更新了新数据库(时,它不会创建任何用户角色
有人能告诉我如何纠正这个问题吗?
谢谢。
(正如你所看到的,我已经将这些表的主键更改为"int"。我很好奇这是否会导致这个问题。(
但是当我运行应用程序(创建了迁移并更新了新数据库(时,它不会创建任何用户角色。
听起来您可能忘记了在任何地方调用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()
}
);
});
这样就没有理由创建一个额外的方法并从某个地方运行它来为数据库种子。