8

私は、学生が特定の専門分野の従業員によって処理されるある種の要求を行うことができる大学向けの簡単なアプリケーションを作成しています。

デフォルトの 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 を抽象クラスに設定しようとしましたが、うまくいきませんでした。どんな助けでも大歓迎です。

更新:コード自体に問題はありませんでした。モデルにこれらの変更を加えた後、データベースを削除 (または更新) していません。その後、すべてが正常に機能します。

4

2 に答える 2

1

@Dragonheart: この再現を試してみましたが、コンテキスト クラスの DBSet 宣言を削除すると正常に動作します。IdentityDbContext は TPH パターンを処理し、表に Discriminator 列を追加して子クラスを区別します。

于 2014-01-13T21:56:19.853 に答える
0

ApplicationUserから継承されているため、クラスIdentityUserから削除してください。DbContext一方、クラスを作成する必要はありません(またはクラスabstract以外からユーザーを作成できない場合は作成できます。詳細については、Table-per-Hierarchyを参照してください。StudentEmployee

部分的には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 に答える