使用ASP.NET Core身份,我使用UserManager.CreateAsync()创建一个新用户,并使用UserManager.AddToRoleAsync将它们分配给现有角色.这是有效的,因为用户和角色之间的实现存储在数据库的AspNetUserRoles表中.
但是当我使用UserManager(例如UserManager.FindByMail()方法)获取用户时,角色列表为空.我也尝试过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没有更好的方法来获取这些数据……
解决方法
默认情况下,UserManager不会加载关系.
手动包含是一种很好的方法,但如here所述 – EntityFramework Core尚不支持直接M: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;}
并自由地使用它…