1
コードファーストで次の種類の関係をモデル化する最良の方法は何ですか?コード最初のTPTモデリングでitemが複数の派生型になることがあります
抽象人
学生:人
先生:人
研究者:人
...もっと多くの...
人1つ以上の派生型です。
私はTPTのアイデアが気に入っていますが、人間と学生、研究者の関係にあるときは、それが適切であるかどうかはわかりません。
コードファーストで次の種類の関係をモデル化する最良の方法は何ですか?コード最初のTPTモデリングでitemが複数の派生型になることがあります
抽象人
学生:人
先生:人
研究者:人
...もっと多くの...
人1つ以上の派生型です。
私はTPTのアイデアが気に入っていますが、人間と学生、研究者の関係にあるときは、それが適切であるかどうかはわかりません。
合成を使用してシナリオをモデル化することができます。これは、すべてのクラスが一意のテーブルに対応する共有プライマリキーマッピングで構成できます。
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();
}
}
継承はできません。 @Erangaで説明されているような別の方法を使用する必要があります。 –