Entity-framework-inheritance

提供:Dev Guides
移動先:案内検索

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

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

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

  • ステップ1 *-プロジェクト名を右クリックしてADO.NETエンティティデータモデルを追加し、[追加]→[新しいアイテム]を選択します…
  • ステップ2 *-1つのエンティティを追加し、Model Firstアプローチの章に記載されているすべてのステップに従ってPersonという名前を付けます。
  • ステップ3 *-次の画像に示すように、いくつかのスカラープロパティを追加します。

スカラープロパティの追加

ステップ4 *-さらに2つのエンティティ *Student および Teacher を追加し、Person Tableからプロパティを継承します。

  • ステップ5 *-次の図に示すように、Studentエンティティを追加し、BaseタイプコンボボックスからPersonを選択します。

ベースタイプコンボボックス

  • ステップ6 *-同様に、教師エンティティを追加します。
  • ステップ7 *-EnrollmentDateスカラープロパティを学生エンティティに、HireDateプロパティを教師エンティティに追加します。

EnrollmentDate

  • ステップ8 *-先に進んでデータベースを生成しましょう。
  • ステップ9 *-デザイン画面を右クリックし、[モデルからデータベースを生成…​]を選択します

データベースの生成

  • ステップ10 *-新しいデータベースを作成するには、[新しい接続]をクリックします。次のダイアログが開きます。 OKをクリックしてください。

新しいデータベース

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

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

データベース作成テーブル

  • ステップ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();
      }
   }
}

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

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
*****************************************************************

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