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.