Entity Framework: tipos de entidades anidadas

Antes de Entity Framework 6, Entity Framework no reconocía entidades o tipos complejos que estaban anidados dentro de otras entidades o tipos complejos. Cuando Entity Framework generó el modelo, los tipos anidados simplemente desaparecieron.

Echemos un vistazo a un ejemplo sencillo en el que tenemos nuestro modelo básico con tres entidades Student, Course e Enrollment.

  • Agreguemos una propiedad Identity, que es un tipo Person. Person es otra entidad, contiene las propiedades BirthDate y FatherName.

  • En términos de Entity Framework, debido a que no tiene identidad y es parte de una entidad, es un tipo complejo de Entity Framework y, de hecho, hemos tenido soporte para tipos complejos desde la primera versión de Entity Framework.

  • El tipo Person no está anidado como se muestra en el siguiente código.

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 también sabrá cómo conservar los tipos de persona cuando se use en versiones anteriores.

Al usar Entity Framework Power Tool, veremos cómo Entity Framework interpreta el modelo. Haga clic con el botón derecho en el archivo Program.cs y seleccione Entity Framework → Ver modelo de datos de entidad (solo lectura)

Ahora verá que la propiedad Identity está definida en la clase Student.

Si esta clase Person no será utilizada por ninguna otra entidad, entonces podemos anidarla dentro de la clase Student, pero esta versión anterior de Entity Framework no reconoce los tipos anidados.

En la versión anterior, genera el modelo nuevamente, no solo no se reconoce el tipo, sino que debido a que no está allí, la propiedad tampoco está allí, por lo que Entity Framework no conservará el tipo Person en absoluto.

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; }
   }
}

Con Entity Framework 6, se reconocen las entidades anidadas y los tipos complejos. En el código anterior, puede ver que Person está anidado dentro de la clase Student.

Cuando usa Entity Framework Power Tool para mostrar cómo Entity Framework interpreta el modelo esta vez, existe la propiedad Identity verdadera y el tipo complejo Person. Entonces, Entity Framework conservará esos datos.

Ahora puede ver que Identity es un tipo de entidad anidada, que no era compatible antes de Entity Framework 6.

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprensión.