繁体   English   中英

实体框架+ ASP.NET身份+存储库模式-如何在加载用户的同时加载角色

[英]Entity Framework + ASP.NET Identity + Repository Pattern - How to load roles at the same time users are loaded

我有一个使用实体框架和存储库模式的MVC 5应用程序。 我有一个用于用户表(AspNetUsers)的存储库,还有一个名为GetAll()的存储库中的方法,该方法从该表中获取所有用户。

我需要向应用程序的用户显示所有用户及其角色,但是我很难通过用户存储库获取角色的实际名称。 我正确编写的GetAll()方法将所有用户以及他们的角色ID(如关联表AspNetUserRoles中定义的那样)带回给我,但我还需要加载角色名称。

从存储库获取所有用户的代码行如下所示:

var users = UsersRepository.GetAll();

我还想要获取分配给用户的角色的角色名称,以便可以在应用程序中显示。

对于那些不熟悉ASP.NET身份表的人,有一个表的用户信息看起来像这样(仅为简洁起见列出了相关字段):

AspNetUsers

  • ID
  • 用户名

接下来是另一个具有角色信息的表,看起来像这样(为简洁起见,仅列出了相关字段):

AspNetRoles

  • ID
  • 名称

最后,中间有一个关联表,看起来像这样:

AspNetUserRoles

  • 用户身份
  • 角色编号

因此,我的基本目标是从用户对象遍历关联表以获取角色名称,这些角色名称全部在我的存储库查询中。 我在想类似的东西:

var usersAndRoles = UsersRepository.GetAll().Include(.......)

你为什么做这个? 您可以使用内置的身份功能轻松地检索用户及其角色。

var user = UserManager.FindByName(User.Identity.Name);
var roles = UserManager.GetRoles(user.Id);

GetRoles以字符串形式返回角色名称列表。

您也可以这样做:

var user = UserManager.FindByName(User.Identity.Name);
var roles = user.Roles.Select(x => x.Role.Name).ToList()

如果您不想单独获得每个用户,则只需执行以下操作:

using (var db = new ApplicationDbContext()) {
    var query = from q in db.Users 
        select new {User = q.UserName, Roles = q.Roles.Select(x => x.Role.Name)};
}

要获取所有角色的列表,建议使用roleManager.Roles

但是您也可以使用数据库上下文:

IdentityDbContext db = new IdentityDbContext(); // Where IdentityDbContext = your database context.

db.Roles.ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM