使用ASP.NET核心身份,我创建了一个UserManager.CreateAsync()
的新用户,并将其分配给UserManager.AddToRoleAsync
的现有角色。这是有效的,因为用户和角色之间的实现存储在数据库的AspNetUserRoles
表中。
但是当我使用UserManager(例如UserManager.FindByMail()
方法)获取用户时,Role
列表为空。我也尝试过EF的Include
函数:
var user = userManager.Users.Include(u => u.Roles).FirstOrDefault(u => u.Email == "test@test.de");
这给了我n:m关联表的ID,因为我需要角色名称,所以它不是很有用。也不可能使用第二个查询加载它们,因为身份用户的Roles
属性是只读的。我希望得到一个List<string>
角色名称。找不到任何关于此的信息。
对我来说,唯一的解决方法似乎是向我的用户添加一个自定义属性,并用数据填充它们,我使用第二个查询获取数据。但那不是一个好的解决方案。不能相信ASP.NET Core Identity没有更好的方法来获取这些数据......
答案 0 :(得分:10)
默认情况下,UserManager不会加载关系。
手动收录是一种很好的方式,但如前所述here - EntityFramework Core尚未支持 N N 。
所以我有两种看法:
(优先的)使用
userManager.GetRolesAsync(user);
这将返回带有用户角色名称的List<string>
。或者使用一些EF查询通过加入IdentityUserRole获取IdentityRole
个对象。不幸的是,这要求接受角色不会直接在用户实体中的事实。
或者你可以实现自定义IdentityUserRole
,在那里创建与IdentityRole
的关系,然后用`
Include(user => user.Roles).ThenInclude(role => role.Role)
如何描述如何实现自己的身份实体。 here。但它的复杂方法和Role
对象将嵌套在绑定实体中。
但是,您可以在ApplicationUser
:
[NotMapped]
public List<string> RoleNames {get; set;}
并随意使用它......
答案 1 :(得分:1)
这是我提出的解决方案。它可能不是最有效的。希望它可以帮到某人。
public class UserVM
{
public string Id { get; set; }
public string UserName { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Roles { get; set; }
}
// Project each element of query into List<UserVM>
var list = (from user in _userManager.Users
select new UserVM
{
Id = user.Id,
UserName = user.UserName,
Name = user.Name,
Email = user.Email
}).ToList();
list.Select(async user =>
{
var userEntity = await _userManager.FindByIdAsync(user.Id);
user.Roles = string.Join("; ", await _userManager.GetRolesAsync(userEntity));
}).ToList();