[英]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
接下来是另一个具有角色信息的表,看起来像这样(为简洁起见,仅列出了相关字段):
AspNetRoles
最后,中间有一个关联表,看起来像这样:
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.