2014-01-11 6 views
8

私は大学生向けの簡単なアプリケーションを作成しています。このタイプのリクエストでは、特定の専門職の従業員によって処理されます。ASP.NET MVC5のApplicationUserクラスをさらに拡張するIDシステム

私はデフォルトの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でユーザー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を抽象クラスにしますが、運はありません。どんな助けもありがとう。

更新日:問題はコード自体にありませんでした。これらの変更をモデルに加えた後で、データベースを削除(または更新)していないだけです。その後、すべてうまく動作します。

答えて

1

@Dragonheart:私はこのreproを試して、コンテキストクラスでDBSet宣言を削除するとうまくいくはずです。 IdentityDbContextはTPHパターンを処理し、テーブルにDiscriminatorカラムを追加して、子クラスを区別します。

+1

あなたのコメントの後...このことができます

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

希望:そのような何かを試してみてくださいApでナビゲーションプロパティを持つそれらの両方のためのplicationUser)、それは学生と従業員のDBSetを削除しなくても機能します。実際の問題はちょっとばかげていました。マイグレーションによってDBを削除または更新するのを忘れてしまっただけです。それは、私が知っている顔の紋章です。とにかくあなたの注意のThx: –

+4

@Dragonheartこれはあなたの問題を解決した場合は、答えとして投稿し、将来の読者の利益のためにそれを受け入れてください。ありがとう。 –

0

ApplicationUserIdentityUserから継承されているため、DbContextクラスから削除してください。一方、あなたはStudentEmployeeクラスから除いてユーザーを作成することを防ぐ場合(あなたが作成することができabstractクラスを作成する必要はありません。詳細については、あなたがTable-per-Hierarchyを見ている可能性があります。

Register部分について私はすでに自分のテーブルに学生や従業員を保持することによってTPTパターンに移動してきたので、私は(evertythingを再現してみました

+0

新しい 'ApplicationUser'インスタンスを作成して、それを次の行に投げ捨て、' Student'インスタンスに置き換えているのはなぜですか? –

+0

両方のタイプのユーザーに対して同じコントローラーでこのコードを使用していましたが、この状況ではApplicationUserインスタンスを作成する必要はありません。 このため、共有プロパティを作成したかったのです。お知らせしてくれてありがとう... –

関連する問題