Entity Framework 6 - Modelando um relacionamento muitos-para-muitos


 Esse artigo mostra como podemos modelar um relacionamento muito-para-muitos e em seguida realizar o seu tratamento usando o Entity Framework 6.

Recursos Usados:

Objetivo :

Modelar um relacionamento muitos-para-muitos a partir de um banco de dados e tabela existentes no SQL Server Local DB.

Como exemplo iremos usar as tabelas : Album, AlbumArtista e Artista que estão relacionadas através de um relacionamento muitos-para-muitos onde temos uma tabela de junção (AlbumArtista).

A tabela de junção AlbumArtista contém apenas as chaves primárias usadas para vincular as tabelas Album e Artista em um relacionamento muitos-para-muitos.

Vamos importar esse relacionamento para um modelo de entidades usando o Entity Framework 6.

Em uma relação muitos-para-muitos, um registro em uma tabela está relacionado a diversos registros em uma segunda tabela, enquanto um registro na segunda tabela está relacionado a diversos registros na primeira tabela.

Esse tipo de relação exige uma terceira tabela, chamada de tabela de junção. A tabela de junção contém as chaves primárias das outras duas tabelas como suas chaves externas.

Vemos abaixo o diagrama de classes dessas tabelas exibido no SQL Server Management Studio:

Criando a Solução no VS

Abra o Visual Studio Express 2012 for Windows Desktop e crie um novo projeto clicando em New Project;

A seguir selecione o template : Other Project Types -> Blank Solution e informe o nome EF6_MuitosMuitos e clique no botão OK;
 

Agora clique no menu FILE -> Add New Project selecionando a linguagem C# e tipo do projeto Windows Forms Application e informando o nome WF_Ef6_MuitosMuitos;

Vamos agora criar um Entity Data Model a partir das tabelas indicadas para criar o nosso modelo de entidades.

A seguir no menu PROJECT clique em Add New Item e a seguir selecione o template ADO .NET Entity Data Model;

Informe o nome Macoratti.edmx pois eu vou usar o banco de dados Macoratti.mdf para gerar o modelo de entidades mas se desejar usar outro nome e outro banco de dados fique a vontade.

Na janela do Assistente selecione a opção - Generate from Database - e clique em Next>;

A seguir selecione a conexão com banco de dados Macoratti (se ela não existir clique em New Connection e crie uma conexão);

Aceite o nome padrão da entity connection e clique no botão Next>;

O nome MacorattiEntities será o nome da string de conexão da entity connection no arquivo de configuração.

A seguir selecione todas as tabelas Album,AlbumArtista e Artista e marque as opções conforme a figura abaixo:

Para terminar clique em Finish;

Será gerado o modelo entidades conforme mostra a figura abaixo:

O relacionamento muitos-para-muitos entre Album e Artista esta representada pela linha com o caractere  *---*  em ambos os lados.

Como um Álbum pode ter muitos Artistas e um Artista pode ter muitos Álbuns, cada uma das propriedades de navegação é do tipo EntityCollection.

Observe que a tabela AlbumArtista não esta representada como uma entidade em nosso modelo.

Como a tabela AlbumArtista não possui nenhuma propriedade escalar o Entity Framework assume que o propósito da tabela é apenas criar a associação entre as tabelas Artista e Album.

Se a tabela tivesse propriedades escalares o EF teria criado um modelo diferente como veremos a seguir.

Vamos criar um interface bem simples no formulário form1.cs do projeto para gerenciar as entidades.

No formulário form1.cs inclua os controles : ListBox - lbDados, Button (btn) a partir da ToolBox conforme o leiaute abaixo:

Vamos implementar o código no formulário as seguintes funcionalidades :

  1. exibir os Artistas e a que Álbum ele esta relacionados
  2. exibir os Álbuns e seus artistas relacionadas
  3. Incluir um Artista e dois álbuns
  4. Incluir um Álbum para dois artistas

Vamos então ao código.

Os namespaces usados no formulário são:

using System;
using
System.Windows.Forms;

1- Exibir os Artistas e a que Álbum ele esta relacionados

private void btnArtistasAlbuns_Click(object sender, EventArgs e)
{
        using (var context = new MacorattiEntities())
         {
                lbDados.Items.Add("Artistas e seus álbums...\n");
                lbDados.Items.Add("----------------------------------------");
                var artistas = context.Artista;
                foreach (var artista in artistas)
                {
                    lbDados.Items.Add(artista.nome);
                    foreach (var album in artista.Album)
                    {
                        lbDados.Items.Add( "       " + album.albumNome);
                    }
                }
                lbDados.Items.Add("");
                lbDados.Items.Add("\nÁlbuns e seus artistas...");
                lbDados.Items.Add("----------------------------------------");
                var albuns = context.Album;
                foreach (var album in albuns)
                {
                    lbDados.Items.Add(album.albumNome);
                    foreach (var artista in album.Artista)
                    {
                        lbDados.Items.Add("      " + artista.nome);
                    }
               }
       }
}

Usando a cláusula Using estamos criando uma nova instância do contexto (MacorattiEntities) e para listar tanto os artistas e álbuns relacionados ou os álbuns e seus artistas através de um laço foreach.

Incluir um Artista e dois álbuns

2- Incluir um artista e dois álbuns

 private void btnIncluiArtista_Click(object sender, EventArgs e)
 {
            using (var context = new MacorattiEntities())
            {
                // adiciona um artista com dois albums
                var artista = new Artista { nome = "Macoratti", email = "macoratti@yahoo.com" };
                var album1 = new Album { albumNome = "VB .NET" };
                var album2 = new Album { albumNome = "C-Sharp" };
                artista.Album.Add(album1);
                artista.Album.Add(album2);
                context.Artista.Add(artista);
            }
 }

Depois de obter uma instância do contexto, criamos e inicializamos uma instância de uma entidade Artista.

A seguir criamos duas instâncias da entidade Album e adicionamos cada album para o artista e então adicionamos o artigos ao contexto do banco de dados.

3- Incluir um Albume e dois artistas

 private void btnIncluirAlbum_Click(object sender, EventArgs e)
 {
            using (var context = new MacorattiEntities())
            {
                // adiciona um album para dois artistas
                var artista1 = new Artista { nome = "Jessica", email= "jessica@net.com" };
                var artista2 = new Artista { nome = "Janice", email = "janjan@net.com"};
                var album = new Album { albumNome = "Experimento" };
                artista1.Album.Add(album);
                artista2.Album.Add(album);
                context.Album.Add(album);
                context.SaveChanges();
            }
 }

Aqui criamos e inicializamos duas instâncias da entidade Artista e uma instância da entidade Album.

Adicionamos o album a ambas as instâncias de artista via propriedade de navegação album de cada artista. (que é to tipo EntityCollection)

Adicionando o album ao contexto do banco de dados faz com que os artistas também sejam adicionados também.

Para realizar a persistência usamos o método SaveChanges().

Pegue o projeto completo aqui: EF6_MuitosMuitos.zip

Rom 7:4 Assim também vós, meus irmãos, fostes mortos quanto à lei mediante o corpo de Cristo, para pertencerdes a outro, àquele que ressurgiu dentre os mortos a fim de que demos fruto para Deus.

Rom 7:5 Pois, quando estávamos na carne, as paixões dos pecados, suscitadas pela lei, operavam em nossos membros para darem fruto para a morte.

Rom 7:6 Mas agora fomos libertos da lei, havendo morrido para aquilo em que estávamos retidos, para servirmos em novidade de espírito, e não na velhice da letra.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti