エンティティフレームワーク-継承

継承により、開発者の考え方をより適切に反映する複雑なモデルを作成し、それらのモデルとの対話に必要な作業を削減することができます。エンティティで使用される継承は、クラスで使用される継承と同じ目的を果たすため、開発者はこの機能がどのように機能するかの基本をすでに知っています。

次の例を見て、新しいコンソールアプリケーションプロジェクトを作成してみましょう。

Step 1 −プロジェクト名を右クリックし、[追加]→[新しいアイテム...]を選択して、ADO.NETエンティティデータモデルを追加します。

Step 2 −モデルファーストアプローチの章に記載されているすべての手順に従って、エンティティを1つ追加し、Personという名前を付けます。

Step 3 −次の図に示すように、いくつかのスカラープロパティを追加します。

Step 4 −さらに2つのエンティティを追加します Student そして Teacher、Personテーブルからプロパティを継承します。

Step 5 −次の図に示すように、Studentエンティティを追加し、BasetypeコンボボックスからPersonを選択します。

Step 6 −同様にTeacherエンティティを追加します。

Step 7 −ここで、EnrollmentDateスカラープロパティをstudentエンティティに追加し、HireDateプロパティをTeacherエンティティに追加します。

Step 8 −先に進んでデータベースを生成しましょう。

Step 9 −デザイン画面を右クリックし、[モデルからデータベースを生成…]を選択します。

Step 10−新しいデータベースを作成するには、[新しい接続...]をクリックします。次のダイアログが開きます。[OK]をクリックします。

Step 11− [完了]をクリックします。これにより、プロジェクトに* .edmx.sqlファイルが追加されます。.sqlファイルを開くと、VisualStudioでDDLスクリプトを実行できます。次に、右クリックして「実行」を選択します。

Step 12 −サーバーエクスプローラーに移動すると、データベースが指定された3つのテーブルで作成されていることがわかります。

Step 13 −次のドメインクラスも自動的に生成されることもわかります。

public partial class Person {
   public int ID { get; set; }
   public string FirstMidName { get; set; }
   public string LastName { get; set; }
}

public partial class Student : Person {
   public System.DateTime EnrollmentDate { get; set; }
}

public partial class Teacher : Person {
   public System.DateTime HireDate { get; set; }
}

以下はContextクラスです。

public partial class InheritanceModelContainer : DbContext {

   public InheritanceModelContainer() : 
      base("name = InheritanceModelContainer") {}

   protected override void OnModelCreating(DbModelBuilder modelBuilder) {
      throw new UnintentionalCodeFirstException();
   }

   public virtual DbSet<Person> People { get; set; }
}

生徒と教師をデータベースに追加して、データベースから取得してみましょう。

class Program {

   static void Main(string[] args) {

      using (var context = new InheritanceModelContainer()) {

         var student = new Student {
            FirstMidName = "Meredith", 
            LastName = "Alonso", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(student);

         var student1 = new Student {
            FirstMidName = "Arturo", 
            LastName = "Anand", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(student1);

         var techaer = new Teacher {
            FirstMidName = "Peggy", 
            LastName = "Justice", 
            HireDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(techaer);

         var techaer1 = new Teacher {
            FirstMidName = "Yan", 
            LastName = "Li", 
            HireDate = DateTime.Parse(DateTime.Today.ToString())
         };

         context.People.Add(techaer1);
         context.SaveChanges();
      }
   }
}

生徒と教師がデータベースに追加されます。N生徒と教師を取得するには、OfType 指定された部門に関連するStudentとTeacherを返すメソッドを使用する必要があります。

Console.WriteLine("All students in database"); 
Console.WriteLine("");

foreach (var student in context.People.OfType<Student>()) {
   string name = student.FirstMidName + " " + student.LastName;
   Console.WriteLine("ID: {0}, Name: {1}, \tEnrollment Date {2} ", 
      student.ID, name, student.EnrollmentDate.ToString());
}

Console.WriteLine("");
Console.WriteLine("************************************************************ *****");
Console.WriteLine("");
Console.WriteLine("All teachers in database");
Console.WriteLine("");

foreach (var teacher in context.People.OfType<Teacher>()) {
   string name = teacher.FirstMidName + " " + teacher.LastName;
   Console.WriteLine("ID: {0}, Name: {1}, \tHireDate {2} ", 
      teacher.ID, name, teacher.HireDate.ToString()); 
}

Console.WriteLine("");
Console.WriteLine("************************************************************ *****");
Console.ReadKey();

最初のクエリでは、OfType <Student>()を使用すると、HireDateプロパティはTeacher Entityの一部であり、同様にOfType <Teacher>()を使用するとEnrollmentDateプロパティにアクセスできないため、HireDateにアクセスできなくなります。

上記のコードを実行すると、次の出力が返されます。

All students in database
ID: 1, Name: Meredith Alonso,   Enrollment Date 10/30/2015 12:00:00 AM
ID: 2, Name: Arturo Anand,      Enrollment Date 10/30/2015 12:00:00 AM
*****************************************************************  
All teachers in database
ID: 3, Name: Peggy Justice,     HireDate 10/30/2015 12:00:00 AM
ID: 4, Name: Yan Li,    HireDate 10/30/2015 12:00:00 AM
*****************************************************************

理解を深めるために、上記の例を段階的に実行することをお勧めします。