Back-End

13 out, 2015

Curso Entity Framework – O relacionamento entre Entidades – X

Publicidade

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) :

  1. Um para um
  2. Um para muitos
  3. 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:

entity-framework-1

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:

entity-framework-2

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:

entity-framework-3

Na próxima aula, vamos tratar das consultas de projeção que selecionam dados no Entity Framework.