Asp.Net 标识 - 标识数据库上下文<TUser>导致添加到 AspNetRoles 表中的字段出现问题



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

相关内容

  • 没有找到相关文章

最新更新