2012-02-28 4 views
1

コードファーストで次の種類の関係をモデル化する最良の方法は何ですか?コード最初のTPTモデリングでitemが複数の派生型になることがあります

抽象人

学生:人

先生:人

研究者:人

...もっと多くの...

人1つ以上の派生型です。

私はTPTのアイデアが気に入っていますが、人間と学生、研究者の関係にあるときは、それが適切であるかどうかはわかりません。

+1

継承はできません。 @Erangaで説明されているような別の方法を使用する必要があります。 –

答えて

4

合成を使用してシナリオをモデル化することができます。これは、すべてのクラスが一意のテーブルに対応する共有プライマリキーマッピングで構成できます。

public class Person 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 

public abstract class Role 
{ 
    public int PersonId { get; set; } 

    public virtual Person Person { get; set; } 
} 

public class Student : Role 
{ 

} 

public class Teacher : Role 
{ 

} 

public class RoleContext : DbContext 
{ 
    public DbSet<Student> Students { get; set; } 

    public DbSet<Teacher> Teachers { get; set; } 

    public DbSet<Person> Persons { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Student>().ToTable("Student"); 
     modelBuilder.Entity<Student>().HasKey(s => s.PersonId); 
     modelBuilder.Entity<Student>().HasRequired(s => s.Person).WithOptional(); 

     modelBuilder.Entity<Teacher>().ToTable("Teacher"); 
     modelBuilder.Entity<Teacher>().HasKey(t => t.PersonId); 
     modelBuilder.Entity<Teacher>().HasRequired(t => t.Person).WithOptional(); 
    } 
} 
関連する問題