我有一个从IdentityUser
派生的自定义用户类User
:
public class User : IdentityUser
{
public UserInfo Info { get; set; }
}
字符串
我使用了一个UserInfo
类和两个子类来存储基于用户类型的附加用户信息:
public class UserInfo
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsArchived { get; set; } = false;
}
public class StudentInfo : UserInfo
{
public List<Enrollment> Enrollments { get; set; }
}
public class InstructorInfo : UserInfo
{
public List<Department> Departments { get; set; }
}
型
在我的UsersController
的Account()
操作中,我使用了注入的UserManager
示例从用户存储中获取用户:
public class UsersController
{
private readonly UserManager<User> usrMgr;
private readonly RoleManager<IdentityRole> roleMgr;
public UsersController(UserManager<User> usrMgr, RoleManager<IdentityRole> roleMgr)
=> (this.usrMgr, this.roleMgr) = (usrMgr, roleMgr);
[Authorize]
public async Task<IActionResult> Account()
{
User user = await userManager.GetUserAsync(this.User); // Here user.Info is null
return user is null ? NotFound() : View(user);
}
}
型
问题是GetUserAsync(this.User)
方法不包含UserInfo
属性,而是将其保留为null
。FindByIdAsync(userId)
也不包含它。如果这是一个DbContext
,我可以使用.Include()
,但我不太确定如何告诉UserManager
在这里包含相关属性。
1条答案
按热度按时间wko9yo5t1#
正如Prolog所提到的,
UserManager
有一个UserManager.Users
属性,它是一个IQueryable<TUser>
。因此,Include()
方法可以像任何其他IQueryable<T>
一样链接到它:字符串
King King建议的另一种解决方案是创建自定义
UserManager
。