进一步扩展ASP.NET MVC5身份系统中的ApplicationUser类

Vla*_*kov 8 entity-framework tph asp.net-mvc-5 asp.net-identity

我正在为大学创建一个简单的应用程序,学生可以提出某种类型的请求,然后由特定专业的员工处理.

我想使用默认的MVC5身份系统,并使用TPH模式扩展ApplicationUser类.所以我将常用属性添加到ApplicationUser:

public class ApplicationUser : IdentityUser
    {
        [Required]
        public string FirstName { get; set; }
        [Required]
        public string LastName { get; set; }
        [Required]
        public string Email { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

然后我创建了两个继承ApplicationUser的类:

public class Student : ApplicationUser
    {
        public string PersonalNumber { get; set; }
        public bool Monitor { get; set; }
        public virtual Group Group { get; set; }
        public virtual ICollection<Request> Requests { get; set; }
    }

public class Employee : ApplicationUser
    {
        public virtual EmployeeSpeciality EmployeeSpeciality { get; set; }
        public virtual ICollection<Request> Requests { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我目前想要的是让两种类型的用户注册为基本身份,并将两者都保存在一个表中,就像在asp.net上继承示例中一样

正如我所想,在AccountController中初始化用户var就足够了,然后将其作为Student或Employee传递给UserManager.但在尝试注册为学生后,我得到了这个例外:

Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'PersonalNumber'.
Invalid column name 'Monitor'.
Invalid column name 'EmployeeSpeciality_Id'.
Invalid column name 'Group_Id'.
Run Code Online (Sandbox Code Playgroud)

我的上下文类:

public class EntityContext : IdentityDbContext
    {
        public EntityContext()
            : base("DbConnection")
        {
        }

        public DbSet<ApplicationUser> ApplicationUsers { get; set; }
        public DbSet<Student> Students { get; set; }
        public DbSet<Employee> Employees { get; set; }
        ...
    }
Run Code Online (Sandbox Code Playgroud)

和控制器动作的一部分:

public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new Student()
            {
                UserName = model.UserName,
                FirstName = model.FirstName,
                LastName = model.LastName,
                Email = model.Email
            };
            var result = await UserManager.CreateAsync(user, model.Password);
Run Code Online (Sandbox Code Playgroud)

我尝试将ApplicationClass设置为抽象类,但没有运气.任何帮助,将不胜感激.

更新:问题不在于代码本身.在对模型进行这些更改后,我根本没有删除(或更新)数据库.一切都运行得很好.

Suh*_*shi 1

@Dragonheart:我尝试了这个重现,如果您删除上下文类中的 DBSet 声明,它会工作得很好。IdentityDbContext 将处理您的 TPH 模式并在表中添加一个鉴别器列来区分子类。

  • @Dragonheart 如果这解决了您的问题,请将其作为答案发布并接受它,以造福未来的读者。谢谢。 (4认同)