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 :
Vamos então ao código.
Os namespaces usados no formulário são:
using
System;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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#