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

时间:2014-01-11 13:43:48

标签: entity-framework asp.net-mvc-5 asp.net-identity tph

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

我想使用默认的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; }
    }

然后我创建了两个继承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; }
    }

我目前想要的是让两种类型的用户都注册为基本身份,并将它们保存在单个表中,如inheritance example on asp.net

正如我想的那样,在AccountController中初始化user 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'.

我的上下文类:

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

和控制者行动的一部分:

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

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

更新:问题不在代码本身。在对模型进行这些更改后,我根本没有删除(或更新)数据库。在它之后一切正常。

2 个答案:

答案 0 :(得分:1)

@Dragonheart:我试过这个repro,如果在上下文类中删除DBSet声明,它会正常工作。 IdentityDbContext将处理您的TPH模式并在表中添加Discriminator列以区分子类。

答案 1 :(得分:0)

由于ApplicationUser继承自IdentityUser,请将其从DbContext类中删除。另一方面,不需要创建abstract类(如果您阻止创建除StudentEmployee类之外的用户,则可以创建。有关更多信息,您可能有看看Table-per-Hierarchy

对于Register部分,尝试类似的事情:

Student user = new Student
{
    UserName = model.UserName,
    FirstName = model.FirstName,
    LastName = model.LastName,
    Email = model.Email
};
var result = UserManager.Create(user, model.Password);

希望这会有所帮助......