Estrutura de entidade - tipos de entidade aninhados

Antes do Entity Framework 6, o Entity Framework não reconhecia entidades ou tipos complexos que estavam aninhados em outras entidades ou tipos complexos. Quando o Entity Framework gerou o modelo, os tipos aninhados simplesmente desapareceram.

Vamos dar uma olhada em um exemplo simples no qual temos nosso modelo básico com três entidades Aluno, Curso e Matrícula.

  • Vamos adicionar uma propriedade Identity, que é do tipo Person. Person é outra entidade, contém as propriedades BirthDate e FatherName.

  • Em termos do Entity Framework, por não ter identidade e ser parte de uma entidade, é um tipo complexo do Entity Framework e, na verdade, temos suporte para tipos complexos desde a primeira versão do Entity Framework.

  • O tipo Person não está aninhado conforme mostrado no código a seguir.

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

O Entity Framework saberá como persistir os tipos de pessoa quando for usado em versões anteriores também.

Usando o Entity Framework Power Tool, veremos como o Entity Framework interpreta o modelo. Clique com o botão direito do mouse no arquivo Program.cs e selecione Entity Framework → View Entity Data Model (somente leitura)

Agora você verá que a propriedade Identity está definida na classe do aluno.

Se essa classe Person não for usada por nenhuma outra entidade, podemos aninhá-la dentro da classe Student, mas essa versão anterior do Entity Framework não reconhece tipos aninhados.

Na versão mais antiga, você gera o modelo novamente, não apenas o tipo não é reconhecido, mas porque não está lá, a propriedade também não está, então o Entity Framework não persistirá o 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; }
   }
}

Com o Entity Framework 6, entidades aninhadas e tipos complexos são reconhecidos. No código acima, você pode ver que Person está aninhado na classe Student.

Quando você usa a ferramenta poderosa do Entity Framework para mostrar como o Entity Framework interpreta o modelo desta vez, há a verdadeira propriedade Identity e o tipo complexo Person. Portanto, o Entity Framework manterá esses dados.

Agora você pode ver que Identity é um tipo de entidade aninhada, que não era compatível antes do Entity Framework 6.

Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.