身份:为什么user.roles为空?

时间:2016-08-24 10:16:06

标签: c# asp.net asp.net-mvc-5 identity

我有一个方法可以获取我在数据库中拥有的所有用户,只需将我这样做:

var allUsers = context.Users.ToList();

我无法弄明白的是,当我调试角色属性时,它是空的:

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;

仍然没有给我角色数据。

3 个答案:

答案 0 :(得分:2)

您必须加载要使用的相关实体,例如:

var allUsers = context.Users.Include(u => u.Roles).ToList();

然后您应该能够访问用户角色。

有关该主题的更多信息here

答案 1 :(得分: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;
    }

这给了我想要的数据,但我认为这是一个肮脏的修复,我希望那里的人有一个正确的解决方案。

答案 2 :(得分: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();

这对我来说很好,希望这对某人有帮助