问题描述
我扩展了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>