2

我希望能够扩展 IdentityRole 的默认实现以包含描述等字段。对 IdentityUser 执行此操作很容易,因为 IdentityDbContext 采用 IdentityUser 类型的通用参数。但是,IdentityDbContext 不允许您为 IdentityRole 执行此操作。我怎样才能做到这一点?

我知道我可以创建一个基本的 DbContext,并实现我自己的 IUserStore,这样我就可以使用我自己的角色类,但我真的不想这样做。

有什么想法吗?

4

2 回答 2

10

我自己也刚刚经历过这种痛苦。事实证明这很简单。只需使用您的新属性扩展 IdentityRole。

public class ApplicationRole : IdentityRole
{
    public ApplicationRole(string name)
        : base(name)
    { }

    public ApplicationRole()
    { }

    public string Description { get; set; }
}

然后你需要添加行

new public DbSet<ApplicationRole> Roles { get; set; }

像这样进入你的 ApplicationDbContext 类,否则你会得到错误。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {}

    new public DbSet<ApplicationRole> Roles { get; set; }
}

这就是我需要做的。确保将 IdentityRole 的所有实例更改为 ApplicationRole,包括您正在播种的任何内容。此外,不要忘记发出“更新数据库”以将更改应用到您的数据库。除非您将“ApplicationRole”设置为鉴别器,否则您的新 RoleManager 不会看到其中的任何现有行。您可以自己轻松地添加它。

高温高压

埃里克

于 2014-01-20T12:45:16.680 回答
2

UserManager<TUser>用作UserStore<TUser>其用户存储 ( IUserStore)。UserManager用于UserStore将用户添加和删除role name作为 IUserRole。

同样,还有接口IRole& IRoleStore<TRole>forIdentityRoleRoleStore<TRole>where TRoleis IdentityRole。这是为了直接与角色一起工作。

所以你可以继承IdentityRole和添加额外的信息。用于RoleStore<MyRole>管理它以及其他信息。

RoleManager<TRole>提供Role的核心交互方式,可以使用MyRoleStore。

MyIdentityRole.cs

public class MyIdentityRole: IdentityRole
{
   public String Description { get; set;}
}
于 2013-11-08T18:26:13.307 回答