Entity-framework-nested-entity-types
エンティティフレームワーク-ネストされたエンティティタイプ
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を使用すると、Entity Frameworkがモデルをどのように解釈するかがわかります。 Program.csファイルを右クリックし、エンティティフレームワーク→エンティティデータモデルの表示(読み取り専用)を選択します
これで、IdentityプロパティがStudentクラスで定義されていることがわかります。
このPersonクラスが他のエンティティによって使用されない場合、Studentクラス内にネストできますが、この以前のバージョンの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 6では、ネストされたエンティティと複合型が認識されます。 上記のコードでは、PersonがStudentクラス内にネストされていることがわかります。
Entity Framework Power Toolを使用して、今回のEntity Frameworkによるモデルの解釈方法を示すと、真のIdentityプロパティとPerson複合型があります。 したがって、Entity Frameworkはそのデータを永続化します。
これで、Identityはネストされたエンティティタイプであり、Entity Framework 6以前ではサポートされていなかったことがわかります。
理解を深めるために、上記の例を段階的に実行することをお勧めします。