ASP.NET Core Identity UserManager返回用户,但不包括相关对象(延迟加载)

wwodge7n  于 12个月前  发布在  .NET
关注(0)|答案(1)|浏览(159)

我有一个从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; }
}


在我的UsersControllerAccount()操作中,我使用了注入的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属性,而是将其保留为nullFindByIdAsync(userId)也不包含它。如果这是一个DbContext,我可以使用.Include(),但我不太确定如何告诉UserManager在这里包含相关属性。

wko9yo5t

wko9yo5t1#

正如Prolog所提到的,UserManager有一个UserManager.Users属性,它是一个IQueryable<TUser>。因此,Include()方法可以像任何其他IQueryable<T>一样链接到它:

await userManager
    .Users
    .Include(usr => usr.UserInfo)
    .FirstOrDefaultAsync(usr => usr.Id == userManager.GetUserId(this.User));

字符串
King King建议的另一种解决方案是创建自定义UserManager

相关问题