如何检索从IdentityUser扩展的用户数据?

问题描述

我扩展了IdentityUser,我需要选择登录用户及其所有数据。
我可以获取当前登录用户,但是在运行时却收到错误null引用异常!

简而言之,我需要让用户“老师”及其所有课程,消息和作业。
目前,我已成功获得所有课程,但无法亲自获得用户。并给出以下错误

处理请求时发生未处理的异常。

我的整个代码如下

模型 AppUser扩展了IdentityUser

public class AppUser: IdentityUser
{
    [Key]
    public override string Id { get => base.Id; set => base.Id = value; }
    [EmailAddress]
    public override string Email { get => base.Email; set => base.Email = value; }
    public override string PhoneNumber { get => base.PhoneNumber; set => base.PhoneNumber = value; }
    public override string UserName { get => base.UserName; set => base.UserName = value; }

    public string Name { get; set; }        // extention 
    public string Photo { get; set; }       // extention 
    public string Description { get; set; } // extention 
}

查看模型 TeachersVM

public class TeachersVM
{
    private AppDbContext _context;

    public TeachersVM(AppDbContext context)
    {
        _context = context;
    }

    public string UserID { get; set; }

    public AppUser appUser { get; set; }
    //public List<Lesson> lessons { get; set; }
    //public List<Message> messages { get; set; }
    //public List<Assignment> assignments { get; set; }

    public TeachersVM Init(string userId) // take user Id and return this view model itself
    {
        // in trace time userId has value but it returns appUser null
        appUser = _context.appUser.Where(l => l.Id == userId).FirstOrDefault();

        lessons = _context.lesson.Where(l => l.TechID == userId).ToList(); // this one works well
        //messages = _context.message.Where(l => l.TechID == userId).ToList();
        //assignments = _context.assignment.Where(l => l.TechID == userId).ToList();
        return this;
    }
}
                    

Controller 中,这就是我所说的View Model教师VM

// Using trace I can read user base data. however,extended data are not visible 
IdentityUser user = await userManager.FindByEmailAsync(model.Email);
// teachersVM injected in the constructor 
return View("TchrProfile",teachersVM.Init(user.Id)); 
// this takes user Id and returns teachersVM which include all lessons,messages and assignments for specific user (I can't even get the user)

视图

   <partial name="_MyLessons" model="Model.lessons" /> // lessons comes with data very well
   <partial name="_MyData" model="Model.appUser" />  // however,appUser return null !!! why !?
   @*<partial name="_MyAssignment" model="Model.assignments" />
   <partial name="_MyMessage" model="Model.messages" />*@

启动中,我将TeachersVM用作服务

    services.AddTransient<TeachersVM>();

AppDbContext

public class AppDbContext : IdentityDbContext<IdentityUser>
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {

    }

    public DbSet<Lesson> lesson { get; set; } 
    public DbSet<Message> message { get; set; }
    public DbSet<Assignment> assignment { get; set; }
    public DbSet<AppUser> appUser { get; set; } // <-----
}    

再次...
在控制器中,我可以找到基类IdentityUser的用户基础数据,但无法检索扩展数据!
在视图模型中,我可以找到userId,但无法从_context.appUser中检索数据!

我需要获取当前用户的所有数据,包括扩展数据,而不仅仅是基础数据。
您认为可能是什么问题?

解决方法

我发现了问题。在两个地方。

首先进入启动

        services.AddIdentity<AppUser,IdentityRole>(
            //options => { options.SignIn.RequireConfirmedAccount = true; }
        )
        .AddEntityFrameworkStores<AppDbContext>()
        .AddDefaultTokenProviders();
        //instead of -------------------------------------------
        //services.AddIdentity<IdentityUser,IdentityRole>()
        //.AddEntityFrameworkStores<AppDbContext>();

第二个 Controller构造器

    private readonly UserManager<AppUser> userManager;
    private readonly SignInManager<AppUser> signInManager;
    private RoleManager<IdentityRole> roleManager;
    private TeachersVM teachersVM;

    public AccountController(
        UserManager<AppUser> userManager,SignInManager<AppUser> signInManager,RoleManager<IdentityRole> roleManager,TeachersVM teachersVM)
    {
        this.userManager = userManager;
        this.signInManager = signInManager;
        this.roleManager = roleManager;
        this.teachersVM = teachersVM;
    }

    // UserManager<AppUser> and SignInManager<AppUser>
    // rather than 
    // UserManager<IdentityUser> and SignInManager<IdentityUser>

然后,我在AppDbContext中不需要此

     public DbSet<AppUser> appUser { get; set; }

我也必须在AppDbContext中更改它

     : IdentityDbContext<IdentityUser>

对此

     : IdentityDbContext<AppUser>