Entity Framework - Tipi di entità annidati

Prima di Entity Framework 6, Entity Framework non riconosceva entità o tipi complessi annidati all'interno di altre entità o tipi complessi. Quando Entity Framework ha generato il modello, i tipi annidati sono semplicemente scomparsi.

Diamo un'occhiata a un semplice esempio in cui abbiamo il nostro modello di base con tre entità Student, Course e Enrollment.

  • Aggiungiamo una proprietà Identity, che è un tipo Person. Person è un'altra entità, contiene le proprietà BirthDate e FatherName.

  • In termini di Entity Framework, poiché non ha identità ed è parte di un'entità, è un tipo complesso di Entity Framework e in realtà abbiamo avuto supporto per i tipi complessi dalla prima versione di Entity Framework.

  • Il tipo di persona non è annidato come illustrato nel codice seguente.

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 saprà come rendere persistenti i tipi Person quando viene usato anche nelle versioni precedenti.

Utilizzando Entity Framework Power Tool vedremo come Entity Framework interpreta il modello. Fare clic con il tasto destro sul file Program.cs e selezionare Entity Framework → Visualizza Entity Data Model (sola lettura)

Ora vedrai che la proprietà Identity è definita nella classe Student.

Se questa classe Person non verrà usata da nessun'altra entità, è possibile nidificarla all'interno della classe Student, ma questa versione precedente di Entity Framework non riconosce i tipi annidati.

Nella versione precedente, si genera nuovamente il modello, non solo il tipo non è riconosciuto, ma poiché non è presente, non è presente nemmeno la proprietà, quindi Entity Framework non persisterà affatto il tipo 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; }
   }
}

Con Entity Framework 6, le entità nidificate e i tipi complessi vengono riconosciuti. Nel codice sopra, puoi vedere che Person è annidato nella classe Student.

Quando usi Entity Framework Power Tool per mostrare come Entity Framework interpreta il modello questa volta, c'è la vera proprietà Identity e il tipo complesso Persona. Quindi Entity Framework manterrà quei dati.

Ora puoi vedere che Identity è un tipo di entità annidato, che non era supportato prima di Entity Framework 6.

Si consiglia di eseguire l'esempio precedente in modo graduale per una migliore comprensione.