我正在为大学创建一个简单的应用程序,学生可以提出某种类型的请求,然后由特定专业的员工处理。
我想使用默认的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设置为抽象类,但没有运气。任何帮助将不胜感激。
更新:问题不在代码本身。在对模型进行这些更改后,我根本没有删除(或更新)数据库。在它之后一切正常。
答案 0 :(得分:1)
@Dragonheart:我试过这个repro,如果在上下文类中删除DBSet声明,它会正常工作。 IdentityDbContext将处理您的TPH模式并在表中添加Discriminator列以区分子类。
答案 1 :(得分:0)
由于ApplicationUser
继承自IdentityUser
,请将其从DbContext
类中删除。另一方面,不需要创建abstract
类(如果您阻止创建除Student
或Employee
类之外的用户,则可以创建。有关更多信息,您可能有看看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);
希望这会有所帮助......