我有一个方法可以获取我在数据库中拥有的所有用户,只需将我这样做:
var allUsers = context.Users.ToList();
我无法弄明白的是,当我调试角色属性时,它是空的:
但在dbo.UserRoles中:
我在这里缺少什么?
编辑:
我的注册方法:
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();
我可以看到所有角色,我还可以看到哪些用户具有特定角色:
编辑3:
尝试关闭和启用延迟加载
this.Configuration.LazyLoadingEnabled = true;
this.Configuration.LazyLoadingEnabled = false;
仍然没有给我角色数据。
答案 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();
这对我来说很好,希望这对某人有帮助