Entity Framework + ASP.NET Identity + Repository Pattern - 如何在加载用户的同时加载角色

bri*_*ave 1 c# asp.net entity-framework repository-pattern asp.net-identity

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

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

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

var users = UsersRepository.GetAll();
Run Code Online (Sandbox Code Playgroud)

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

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

AspNet用户

  • ID
  • 用户名

然后还有另一个表,其中包含看起来像这样的角色信息(为简洁起见,仅列出了相关字段):

AspNet角色

  • ID
  • 姓名

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

AspNet 用户角色

  • 用户身份
  • 角色 ID

所以我的基本目标是从用户对象通过关联表来获取我的存储库查询中的所有角色名称。我在想这样的事情:

var usersAndRoles = UsersRepository.GetAll().Include(.......)
Run Code Online (Sandbox Code Playgroud)

Eri*_*sch 5

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

var user = UserManager.FindByName(User.Identity.Name);
var roles = UserManager.GetRoles(user.Id);
Run Code Online (Sandbox Code Playgroud)

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

你也可以这样做:

var user = UserManager.FindByName(User.Identity.Name);
var roles = user.Roles.Select(x => x.Role.Name).ToList()
Run Code Online (Sandbox Code Playgroud)

如果您不想单独获取每个用户,则可以简单地执行以下操作:

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)};
}
Run Code Online (Sandbox Code Playgroud)