8

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

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

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

正如我所想,在 AccountController 中初始化用户变量就足够了,然后将其作为学生或员工传递给 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 设置为抽象类,但没有运气。任何帮助,将不胜感激。

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

4

2 回答 2

1

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

于 2014-01-13T21:56:19.853 回答
0

ApplicationUser继承自,IdentityUser将其从您的DbContext类中删除。另一方面,不需要创建一个abstract类(如果您阻止创建除 fromStudentEmployee类之外的用户,则可以创建。有关更多信息,您可以查看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);

希望这可以帮助...

于 2016-10-06T17:50:24.187 回答