身份认证:为什么用户角色为空?

7

我有一个方法可以获取我的数据库中所有用户,简单来说我是这样做的:

var allUsers = context.Users.ToList();

我无法理解的是,当我调试roles属性时,它是空的:

enter image description here

但在dbo.UserRoles中:

enter image description here

我错过了什么吗?

编辑:

我的注册方法:

    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email, FirstName = model.FirstName, LastName = model.LastName };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                UserManager.AddToRole(user.Id, model.UserRole.ToString());

                return RedirectToAction("Index", "Home");                 
            }
            AddErrors(result);
        }

        // If we got this far, something failed, redisplay form
        return PartialView("~/Views/Account/Register.cshtml",model);
    }

编辑2:

获取角色时,可以像这样:

var roles  = context.Roles.ToList();

我可以看到所有的角色,也可以看到哪些用户拥有特定的角色:

enter image description here

编辑 3:

尝试关闭和打开懒加载

 this.Configuration.LazyLoadingEnabled = true;

 this.Configuration.LazyLoadingEnabled = false;

仍然没有给我角色数据。


天哪,这是个很好的问题,但却没有任何答案。为什么这么难呢? - Jeremy A. West
3个回答

5
你需要使用Include加载想要使用的相关实体,像这样:
var allUsers = context.Users.Include(u => u.Roles).ToList();

那么您应该能够访问用户角色。

有关该主题的更多信息在此处


1
谢谢。小提示是,在代码顶部加上“using System.Data.Entity;”可能会使编辑器中的“.Include”无法解析。 - Visual Micro

1
到目前为止,我还无法按照自己的方式解决这个问题。我创建了一个有效的解决方法:
我创建了一个方法来获取每个用户的角色,如下所示:
    public string GetRole(string userId)
    {
        var role = UserManager.GetRoles(userId);

        return role[0];
    }

在我的原始Getuser方法中,我调用了我最近开发的方法:

    public UserModel GetUsers()
    {
       var allUsers = context.Users.Include("Roles").ToList();

       var model = new UserModel
         {
            Users = allUsers.Select(x => new OverWatchUser
            {
                Email = x.Email,
                EmailConfirmed = x.EmailConfirmed,
                FirstName = x.FirstName,
                LastName = x.LastName,
                OrgId = x.OrgId,
                Role = GetRole(x.Id)

            }).ToList()

        };

        return model;
    }

这给我提供了想要的数据,但我认为这是一个不太干净的解决方法,希望有人能提供一个更好的解决方案。

0
您可以像以下这样使用 context.Roles 代替 context.Users,并筛选目标用户角色。诀窍是在 where 方法中过滤目标用户角色。
string Id="the_required_user_Id";

 var roles = context.Roles
                    .Include(r => r.Users)
                    .Where(r => (r.Users.Select(u => u.UserId).Contains(Id)))
                    .ToList();

这对我很有效,希望能帮到其他人


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接