首页 > 解决方案 > ASP.NET Core Identity UserManager 返回用户而不包含相关对象(延迟加载)

问题描述

我有一个自定义用户类User派生自IdentityUser

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; }
}

在我的Account()操作中UsersController,我使用注入的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)也不包括它。如果这是 a DbContext,我本可以使用 an.Include()但我不太确定如何告诉 a 在UserManager此处包含相关属性。

标签: c#asp.netasp.net-coreentity-framework-coreasp.net-identity

解决方案


正如King King所说,创造一个习俗UserManager似乎是要走的路。但是,我最终使用的是Prolog提到的更简单的方法,使用的UserManager.Users是 an 属性,IQueryable因此Include()可以在其上调用该方法:

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

推荐阅读