Учебники

Entity Framework — Вложенные типы сущностей

До Entity Framework 6 Entity Framework не распознавала объекты или сложные типы, которые были вложены в другие объекты или сложные типы. Когда Entity Framework сгенерировал модель, вложенные типы просто исчезли.

Давайте рассмотрим простой пример, в котором у нас есть базовая модель с тремя сущностями: ученик, курс и зачисление.

  • Давайте добавим свойство Identity, которое является типом Person. Person — это другая сущность, содержащая свойства BirthDate и FatherName.

  • В терминах Entity Framework, поскольку он не имеет идентичности и является частью сущности, это сложный тип Entity Framework, и у нас фактически была поддержка сложных типов начиная с первой версии Entity Framework.

  • Тип Person не является вложенным, как показано в следующем коде.

Давайте добавим свойство Identity, которое является типом Person. Person — это другая сущность, содержащая свойства BirthDate и FatherName.

В терминах Entity Framework, поскольку он не имеет идентичности и является частью сущности, это сложный тип 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 и выберите Entity Framework → Просмотреть модель данных Entity (только для чтения).

Framework Power Tool

Теперь вы увидите, что свойство 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.

Мы рекомендуем вам выполнить вышеприведенный пример пошагово для лучшего понимания.