使用ASP.NET身份来检索多个用户,包括其角色在EF Core中



我试图检索多个用户,包括其角色。这是在论坛中使用的,我想在该论坛上显示对线程发表评论的用户的角色。我已经看到了许多使用UserManagerRoleManager检索单个IdentityUser角色的示例,但是如前所述,我有多个我希望检索的用户。

我尝试在用户上包括作为属性的角色,例如:

public virtual ICollection<IdentityUserRole<string>> Roles { get; set; }

但这似乎不起作用。我尝试跳过多一部分的表格,然后直接将角色实体包含在我的用户中:

public virtual ICollection<IdentityRole> Roles { get; set; }

也没有区别,仍然行不通。基本上,我只想将角色加入用户,但我不确定如何。

包括IdentityUserRole<string>属性并检索我的用户,给我以下错误:

未知列'x.userprofile.roles.userid1'在"字段列表"

这是我的选择:

comments = _context.Comments
    .Include(x => x.UserProfile)
    .Include(x => x.UserProfile.Roles)
    .OrderBy(x => x.CreateDate)
    .Where(x => x.ThreadId == id && !user.IgnoredUsers.Contains(x.UserProfile.UserName))
    .ToPagedList(Constants.PAGER_DEFAULT_SMALL, page);

我前几天遇到了这个问题。我找到了一些资源,说我应该建立关系并在ApplicationUser对象中建立道具,但我不想走这条路。我最终只是使用linq查询表达式来构建所需的数据。

var usersWithRoles = (
  from u in _db.Users
  select new
  {
    Id = u.Id,
    Email = u.Email,
    Roles = (
      from ur in _db.UserRoles
      join r in _db.Roles on ur.RoleId equals r.Id
      where ur.UserId == u.Id
      select r.Name).ToArray()
  });

编辑:这假设您想要一系列字符串中的角色名称。如果您在扩展此查询以满足您的需求时遇到困难,只需发表评论,我会尽力帮助您。

编辑:以下查询应更靠近您的用例。我无法测试查询,所以让我知道您是否遇到任何错误

public class CommentViewModel
{
    public virtual Comment Comment { get; set; }
    public virtual UserProfile User { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
}
var comments = (
  from c in _context.Comments
  join u in _context.UserProfiles on c.UserId equals u.Id
  select new CommentViewModel
  {
    Comment = c,
    User = u,
    Roles = (
      from ur in _context.UserRoles
      join r in _context.Roles on ur.RoleId equals r.Id
      where ur.UserId == u.Id
      select r)
  });

您不需要添加角色的导航属性;已经通过IdentityUser继承在ApplicationUser上存在。该属性是UserRoles,它是IdentityUserRole S的集合,它本身就是代表IdentityUserIdentityRole之间M2M的实体。长而短:

var users = db.Users.Include(x => x.UserRoles).Where(...);

不幸的是,由于IdentityUserRole没有导航属性,因此没有直接的方法可以在此处真正获得角色。结果,您需要一个单独的查询才能获得角色:

var usersRoleIds = users.SelectMany(x => x.UserRoles).Select(x => x.RoleId);
var usersRoles = db.Roles.Where(x => userRoleIds.Contains(x));

最后,您可以通过以下方式获得任何一个特定用户的角色:

var specificUserRoles = usersRoles.Where(x => specificUser.UserRoles.Select(r => r.RoleId).Contains(x.Id));

它不是完全 easy ,但是您可以将所有这些代码分解为某种映射实用程序类,并且只需返回带有已附加角色的"用户"视图模型的列表。

相关内容

  • 没有找到相关文章