エンティティフレームワーク-ネストされたエンティティタイプ

Entity Framework 6より前は、Entity Frameworkは、他のエンティティまたは複合型内にネストされたエンティティまたは複合型を認識しませんでした。Entity Frameworkがモデルを生成したとき、ネストされた型は消えました。

Student、Course、Enrollmentの3つのエンティティを持つ基本モデルがある簡単な例を見てみましょう。

  • PersonタイプであるプロパティIdentityを追加しましょう。Personは別のエンティティであり、BirthDateプロパティとFatherNameプロパティが含まれています。

  • Entity Frameworkの用語では、IDがなく、エンティティの一部であるため、Entity Frameworkの複合型であり、Entity Frameworkの最初のバージョン以降、実際には複合型がサポートされています。

  • 次のコードに示すように、Personタイプはネストされていません。

public class Student {
   public int ID { get; set; }
   public string LastName { get; set; }
   public string FirstMidName { get; set; }
   public DateTime EnrollmentDate { get; set; }
   public Person Identity { get; set; }
	
   public virtual ICollection<Enrollment> Enrollments { get; set; }
}

public class Person {

   public Person(string fatherName, DateTime birthDate) {
      FatherName = fatherName;
      BirthDate = birthDate;
   }
	
   public string FatherName { get; set; }
   public DateTime BirthDate { get; set; }
}

Entity Frameworkは、以前のバージョンでも使用されている場合に、Personタイプを永続化する方法を認識します。

Entity Framework Power Toolを使用して、EntityFrameworkがモデルをどのように解釈するかを確認します。Program.csファイルを右クリックし、[エンティティフレームワーク]→[エンティティデータモデルの表示(読み取り専用)]を選択します。

これで、IdentityプロパティがStudentクラスで定義されていることがわかります。

このPersonクラスが他のエンティティによって使用されない場合は、Studentクラス内にネストできますが、この以前のバージョンのEntityFrameworkはネストされた型を認識しません。

古いバージョンでは、モデルを再度生成します。タイプが認識されないだけでなく、モデルが存在しないため、プロパティも存在しないため、EntityFrameworkはPersonタイプをまったく保持しません。

public class Student {
   public int ID { get; set; }
   public string LastName { get; set; }
   public string FirstMidName { get; set; }
	
   public DateTime EnrollmentDate { get; set; }
   public Person Identity { get; set; }
	
   public virtual ICollection<Enrollment> Enrollments { get; set; }

   public class Person {

      public Person(string fatherName, DateTime birthDate) {
         FatherName = fatherName;
         BirthDate = birthDate;
      }

      public string FatherName { get; set; }
      public DateTime BirthDate { get; set; }
   }
}

Entity Framework 6では、ネストされたエンティティと複合型が認識されます。上記のコードでは、PersonがStudentクラス内にネストされていることがわかります。

今回、EntityFrameworkパワーツールを使用してEntityFrameworkがモデルをどのように解釈するかを示すと、真のIdentityプロパティとPerson複合型があります。したがって、EntityFrameworkはそのデータを永続化します。

これで、Identityがネストされたエンティティタイプであり、Entity Framework6より前ではサポートされていなかったことがわかります。

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