私は、学生が特定の専門分野の従業員によって処理されるある種の要求を行うことができる大学向けの簡単なアプリケーションを作成しています。
デフォルトの MVC5 ID システムを使用し、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 を継承する 2 つのクラスを作成しました。
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; }
}
私が現在望んでいるのは、両方のタイプのユーザーをベースIDとして登録し、asp.netの継承の例のように両方を単一のテーブルに保持することです
私が思ったように、AccountController でユーザー var を初期化するだけで十分です。これは、UserManager に Student または Employee として渡されます。しかし、学生として登録しようとすると、次の例外が発生します。
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 を抽象クラスに設定しようとしましたが、うまくいきませんでした。どんな助けでも大歓迎です。
更新:コード自体に問題はありませんでした。モデルにこれらの変更を加えた後、データベースを削除 (または更新) していません。その後、すべてが正常に機能します。