如何将IdentityRole扩展为自定义表名

时间:2014-10-02 09:47:04

标签: c# asp.net-mvc-5 asp.net-identity

我正在尝试为我的MVC 5,Identity 2.0项目实现基于角色的安全性。 我一直在网上看一些教程,但有点卡住了。

我创建了以下内容:

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

    public Role()
    { }

    public string Description { get; set; }
    public string MenuIcon { get; set; }
    public string ControllerName { get; set; }
    public string ActionName { get; set; }
}

和我的背景:

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        base.OnModelCreating(modelBuilder);

        //rename the tables and columns used by the Identity Framework
        modelBuilder.Entity<User>().ToTable("User");
        modelBuilder.Entity<Role>().ToTable("Role");
        modelBuilder.Entity<UserRole>().ToTable("UserRole");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaim");
    }

和我的种子方法:

    RoleManager roleManager = new RoleManager(new RoleStore<Role>(context));
    roleManager.Create<Role, string>(new Role("Orders"));

但是,当我运行应用程序时,它会为角色创建数据库,其中包含2个表:Role(这是我希望角色存在的位置,它包含我的自定义属性)和AspNetRoles。它确实使用我在Seed方法中创建的角色填充两个表。

我在做错的确切是它创建了2个表?

2 个答案:

答案 0 :(得分:3)

所有asp.net表都应该识别新表名,而不仅仅是更改的表。

用户表:

public class User : IdentityUser<string, UserLogin, UserRole, UserClaim>
{
    // Your properties
}

UserLogin表:

public class UserLogin : IdentityUserLogin { }

UserRole表:

public class UserRole : IdentityUserRole { }

UserClaim表:

public class UserClaim : IdentityUserClaim { }

角色表:此帽子将继承自IdentityRole<string, UserRole>

public class Role : IdentityRole<string, UserRole> 
{ 
    //Any relevant properties

    public string Description { get; set; }
    public string MenuIcon { get; set; }
    public string ControllerName { get; set; }
    public string ActionName { get; set; }    
}

数据上下文:必须从IdentityDbContext<User, Role, string, UserLogin, UserRole, UserClaim>

继承
public class YourDataContext : IdentityDbContext<User, Role, string,   UserLogin, UserRole, UserClaim>
{
    // Your DbSet items

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>().ToTable("User");
        modelBuilder.Entity<Role>().ToTable("Role");
        modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<UserRole>().ToTable("UserRole");

        modelBuilder.Entity<User>().Property(r => r.Id);
        modelBuilder.Entity<UserClaim>().Property(r => r.Id);
        modelBuilder.Entity<Role>().Property(r => r.Id);

       //Add your new properties of Role table in here.


    }
}

在这个例子中,我使用了string类型的表格的Id。

希望这有帮助。

答案 1 :(得分:2)

删除此行:

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

然后你必须用你自己的列替换默认的 AspNetRoles 表列。

var applicationRole = modelBuilder.Entity<ApplicationRole>().ToTable("Roles");
applicationRole.Property(r => r.Name).HasColumnName("Description");
...

但是,如果要自定义AspNet标识配置文件,则可以更好地创建新的相关表格(check this link)。