如何扩展Microsoft.AspNet.Identity.EntityFramework.IdentityRole

时间:2013-11-08 17:38:36

标签: asp.net-mvc entity-framework asp.net-mvc-5 asp.net-identity

我希望能够扩展IdentityRole的默认实现,以包含Description等字段。为IdentityUser执行此操作非常简单,因为IdentityDbContext采用IdentityUser类型的通用参数。但是,IdentityDbContext不允许您为IdentityRole执行此操作。我怎么能做到这一点?

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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将不会看到其中的任何现有行。你可以自己轻松添加它。

HTH

埃里克

答案 1 :(得分:2)

UserManager<TUser>使用UserStore<TUser>作为其用户商店(IUserStore)。 UserManagerUserStore一起使用,可以将用户添加到role name并将其作为IUserRole删除。

同样,还有接口IRole&amp; IRoleStore<TRole>的{​​{1}}和IdentityRole RoleStore<TRole>的{​​{1}} TRole。这是直接与Roles一起工作的。

因此,您可以继承IdentityRole并添加其他信息。使用IdentityRole管理其他信息。

RoleStore<MyRole>为Role提供核心交互方法,可以使用MyRoleStore。

MyIdentityRole.cs

RoleManager<TRole>