IdentityDbContext导致添加到AspNetRoles的属性/字段出现问题
我认为问题在于IdentityDbContext采用IdentityUser类型:
public class MyIdentityDb : IdentityDbContext<ApplicationUser>
{
public IdentityDb()
: base("IdentityDb")
{
}
}
但让我解释一下…
我们可以通过向继承自IdentityUser的ApplicationUser类添加属性来向AspNetUsers表添加字段,这真是太棒了。示例:
public class ApplicationUser : IdentityUser
{
[Required]
[StringLength(50)]
public string FirstName { get; set; }
[Required]
[StringLength(50)]
public string LastName { get; set; }
}
很自然,我们可以通过向继承自IdentityRole的ApplicationRole类添加属性来向AspNetRoles表添加字段。示例:
public class ApplicationRole : IdentityRole
{
[Required]
[StringLength(50)]
public string ProperName { get; set; }
}
效果完美。我们可以在数据库中看到该字段。我们可以向其中添加数据。例如:
RoleManager<ApplicationRole> roleManager = new RoleManager<ApplicationRole>(new RoleStore<ApplicationRole>(new MyIdentityDb()));
var role = new ApplicationRole() { Name = name, ProperName = propername };
var result = await roleManager.CreateAsync(role);
但现在我们在试图获取数据时遇到了一个问题。示例:
我们的ViewModel:
public class IndexViewModel
{
public IList<ApplicationUser> Users { get; set; }
public IList<ApplicationRole> Roles { get; set; }
}
在我们的控制器上:
private MyIdentityDb myIdentityDb = new MyIdentityDb();
我们控制器上的索引方法:
public ViewResult Index(int? page)
{
return View(new IndexViewModel
{
Users = myIdentityDb.Users.ToList(),
Roles = myIdentityDb.Roles.ToList()
});
}
错误出现在"myIdentityDb.Roles.ToList()"上,并显示"无法隐式转换类型System.Collection.Generic.List<Microsoft.AspNet.Identity.EntityFramework.IdentityRole> to System.Collections.Generic.IList<MyApp.Models.ApplicationRole>
…
当然,我们可以像下面的例子一样,将ViewModel更改为使用类型IdentityRole,但之后我们无法访问AspNetRoles表中的新"ProperName"字段:
public class IndexViewModel
{
public IList<ApplicationUser> Users { get; set; }
public IList<IdentityRole> Roles { get; set; }
}
因此,我们可以尝试创建另一个Db类,并将IdentityRole类型而不是IdentityUser:传递给它
public class MyIdentityDb : IdentityDbContext<ApplicationUser>
{
public MyIdentityDb()
: base("MyIdentityDb")
{
}
}
public class MyIdentityRolesDb : IdentityDbContext<ApplicationRole>
{
public MyIdentityRolesDb()
: base("MyIdentityDb")
{
}
}
并更改我们的控制器:
private MyIdentityDb myIdentityDb = new MyIdentityDb();
private MyIdentityRolesDb myIdentityRolesDb = new MyIdentityRolesDb();
并更改控制器上的索引方法:
public ViewResult Index(int? page)
{
return View(new IndexViewModel
{
Users = myIdentityDb.Users.ToList(),
Roles = myIdentityRolesDb.Roles.ToList()
});
}
但我们最终也遇到了同样的问题;IdentityDbContext采用IdentityUser类型。
有什么想法可以通过自定义字段/属性获得角色列表吗
因此,如果您升级到2.0.0测试版软件包,您应该能够直接从角色管理器获得ApplicationRole的IQueryable:
roleManager.Roles
因此,您不必下拉到DB上下文,这是1.0中的一个限制,在2.0版本中已经修复。
请看下面的文章,它详细解释了您要做的事情http://typecastexception.com/post/2014/02/13/ASPNET-MVC-5-Identity-Extending-and-Modifying-Roles.aspx