2014-10-02 48 views
4

我正在尝试为我的MVC 5 Identity 2.0项目实现基于角色的安全性。 我一直在看互联网上的一些教程,但有点卡住了。如何将IdentityRole扩展为自定义表名

我创建了以下内容:

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")); 

然而,当我运行应用程序,它会创建具有两个表的角色的数据库:Role(这是我希望角色存在的地方,我吨包含我的自定义属性)和AspNetRoles。它确实使用我在Seed方法中创建的角色来填充这两个表。

我在做什么错,确切地说它是创建2个表?

+0

我有类似的问题。你终于到了解决方案? – 2015-08-13 18:49:54

回答

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)。

+0

谢谢。不幸的是,这并没有帮助。它做了同样的事情 - 创建了两个表,并创建了两个角色。 – Lock 2014-10-02 11:06:42

+1

@Lock你确定删除行“new public DbSet Roles {get; set;}”表中的“Role”是否仍然被创建? – 2014-10-02 13:37:02

+0

你好。是的,我确实删除了那一点。 – Lock 2014-10-03 01:31:52

3

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

用户表:

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

用户登陆表:

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. 


    } 
} 

继承在这个例子中我已经使用的表的ID作为string类型。

希望这会有所帮助。

+0

谢谢!我遇到的问题是'错误类型'Express.Models.Role'不能用作泛型类型或方法'Microsoft.AspNet.Identity.EntityFramework.RoleStore '中的类型参数'TRole'。没有从'Express.Models.Role'到'Microsoft.AspNet.Identity.EntityFramework.IdentityRole'的隐式引用转换。'我也收到了类似'User'的消息。 – Lock 2014-10-03 00:16:23

+0

我也使用身份框架2.0,但这对我很有用。确保你正确放置了两种类型的角色表'UserRole'和'Role'。检查这个http://stackoverflow.com/questions/22682017/why-is-there-an-implementation-difference-between-the-userstore-and-the-rolestor。也检查此链接https://aspnetidentity.codeplex.com/workitem/2126 – DSR 2014-10-03 08:12:23

+0

谢谢!顺便说一句,你并不需要改变表名,这是不需要的,我也没有添加这些'modelBuilder.Entity ().Property(r => r.Id);'我所​​注意到的是一点'错误'如果你尝试添加属性到AspNetRoles表,代码优先的迁移有时候必须删除它并重新添加它。您可以安全地编辑迁移并添加列。哦,我也有这个问题的锁,但我只需要改变如何创建一个UserStore和管理器。 – CularBytes 2018-02-28 23:12:11

相关问题