Nesta aula, vamos tratar do relacionamento entre entidades no Entity Framework (aula anterior).
Podemos ter 3 tipos de relacionamentos em um Entity Data Model (EDM) :
- Um para um
- Um para muitos
- Muitos para Muitos
O Entity Data Model (EDM), ou modelo de entidades de dados, pode ser considerado o coração da Entity Framework.
O EDM é um modelo entidades – relacionamentos onde:
- Entidades são instâncias de tipos de entidades como Clientes e Produtos, os quais estão estruturados em registros e chaves;
- Relacionamentos são instâncias de tipos de relacionamentos que são associações entre dois ou mais tipos de entidades.
É a partir do modelo de entidades que podemos escrever código usando as diferentes APIs, como o provedor EntityClient ou o Object Services com LINQ to Entitie.
Vamos examinar as tabelas do banco de dados EscolaDB.mdf antes de falar do relacionamento no EDM.
Abaixo temos a figura do diagrama de relacionamento das tabelas do banco de dados EscolaDB.mdf:
No diagrama de relacionamentos podemos identificar os seguintes relacionamentos:
- Um-para-Um: Aluno e AlunoEndereco possuem uma relacionamento one-to-one, ou seja, Aluno possui zero ou um AlunoEndereco;
- Um-para-Muitos: Padrao e Professor possuem um relacionamento one-to-many, ou seja, muitos Professores podem estar associados com um Padrao;
- Muitos-para-Muitos: Aluno e Curso possuem um relacionamento many-to-many usando a tabela AlunoCurso, onde AlunoCurso inclui os campos AlunoId e CursoId. Assim, um aluno pode estar vinculado a muitos cursos, e um curso também pode ter muitos alunos.
Quando criamos um ADO .NET Enty Data Model a partir do banco de dados EscolaDB.mdf usando a opção EF Designer from database, serão criadas as seguintes entidades e relacionamentos no EDM:
Como podemos observar :
- Aluno e AlunoEndereco possuem um relacionamento Um-para-Um (zero ou um); a entidade AlunoEndereco possui a propriedade AlunoId como chave primária, a qual estabelece o relacionamento One-to-One.
- A entidade Padrao e Professor possuem um relacionamento Um-para-Muitos marcado pela multiplicidade, onde 1 é para Um e * é para Muitos.
- A entidade Padrao possui a propriedade de navegação ‘Professores’, a qual indica que um Padrao pode ter uma coleção de Professores e a entidade Professor possui a propriedade de navegação Padrao, que indica que Professor está associado a um Padrao. Isso estabelece o relacionamento One-to-Many.
- Aluno e Curso possuem um relacionamento Muito-para-Muitos marcado pela multiplicidade *, mas não vemos representada no EDM a entidade AlunoCurso que possui a chave primária para ambas as tabelas.
- Isso ocorre porque o EDM representa um relacionamento Muitos-para-Muitos através do mapeamento; e isso ocorreu nesse exemplo porque a tabela de junção possui somente as chaves primárias para ambas as tabelas. Se a tabela tivesse outro campo, seria criada uma entidade para a tabela.
O relacionamento Muitos-para-Muitos no EDM
Abrindo o arquivo EDM em um editor XML (pode usar o NotePad++), você pode ver que a seção do SSDL possui a EntitySet AlunoCurso, mas a seção CSDL não tem a EntitySet AlunoCurso – ela está sendo mapeada na propriedade de navegação das entidades Aluno e Curso.
Na seção MSL (CS Mapping), existe um mapeamento entre Aluno e Curso na tabela AlunoCurso em <AssociationSetMapping /> :
..... <Association Name="FK_AlunoCurso_Curso"> <End Role="Curso" Type="Self.Curso" Multiplicity="1" /> <End Role="AlunoCurso" Type="Self.AlunoCurso" Multiplicity="*" /> <ReferentialConstraint> <Principal Role="Curso"> <PropertyRef Name="CursoId" /> </Principal> <Dependent Role="AlunoCurso"> <PropertyRef Name="CursoId" /> </Dependent> </ReferentialConstraint> </Association> ...
Assim, o relacionamento Muitos-para-Muitos está sendo gerenciado pelo mapeamento CS no EDM. Então, quando você adiciona um Aluno a um curso ou um Curso a uma entidade Aluno e salva, então será incluída uma PK do aluno adicionado e do curso adicionado na tabela AlunoCurso. Portanto, esse mapeamento não só permite uma associação conveniente diretamente entre as duas entidades, mas também gerencia consultas, inserções e atualizações através dessa articulação.
Nota: O EDM faz isso apenas quando a tabela de junção possui somente colunas PK para ambas as tabelas. Se houver outras colunas na tabela, então o EDM vai tratá-las como entidades normais, e você tem que usar ‘Join’ em sua consulta para buscar os dados.
Para um exemplo prático e completo, veja o artigo: Entity Framework 6 – Modelando um relacionamento muitos-para-muitos.
Gráfico de Entidade (Entity Graph)
Quando uma entidade tem um relacionamento com outras entidades, então uma hierarquia completa de objetos é chamada de um “gráfico de entidade’. Por exemplo, a seguir temo um gráfico da entidade Aluno, que inclui a hierarquia completa de objetos : Padrão, AlunoEndereco e Curso:
Na próxima aula, vamos tratar das consultas de projeção que selecionam dados no Entity Framework.