{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
01/03/2010
Fala galera, recebi algumas dúvidas por e-mail e vamos resolver aqui.Vamos trabalhar com relações many-to-many utilizando POCO e o Entity Framework 4.0.Para ver como trabalhar com POCO no EF4 veja este post aqui.Vamos fazer um exemplo bem simples, trabalhando com produtos e lojas. Cada produto poderá estar em muitas lojas, e uma loja poderá conter muitos produtos.Abaixo temos o desenho de nosso modelo inicial:
Feito isso vamos criar uma associação entre nossas entidades, como pode ser visto abaixo:
Feito isso basta salvarmos nosso modelo e gerar o banco de dados. Lembrando de desmarcar a opção de geração de código no modelo (veja aqui como fazer isso).Nossas classes ficarão simples, como não poderia deixar de ser.Abaixo vemos a classe Produto, que como pode-se notar não possui nenhuma dependência do entity Framework e nem conhece nada relacionado com banco de dados:
public class Produto{
public virtual int Id { get;
set;
}
public virtual string Nome { get;
set;
}
public virtual decimal ValorSugerido { get;
set;
}
private IList<loja> lojasOndeVende = new List<loja>();
public virtual IList<loja> LojasOndeVende { get {
return this.lojasOndeVende;
}
set { this.lojasOndeVende = value;
}
}
}
</loja></loja></loja>
Abaixo temos a classe Loja:
public class Loja{
public virtual int Id { get;
set;
}
public virtual string Nome { get;
set;
}
public virtual string Cidade { get;
set;
}
private IList<produto> produtosQueVende = new List<produto>();
public virtual IList<produto> ProdutosQueVende { get {
return this.produtosQueVende;
}
set { this.produtosQueVende = value;
}
}
}
}
</produto></produto></produto>
E aqui temos nossa classe de contexto do Entity Framework, que também criamos, de forma bastante simples:
public class EF4Context : ObjectContext{
public EF4Context() : base("name=ModeloManyToManyContainer", "ModeloManyToManyContainer") { }
private IObjectSet<produto> produtos;
public IObjectSet<produto> Produtos { get {
if(produtos == null) produtos = CreateObjectSet<produto>();
return produtos;
}
}
private IObjectSet<loja> lojas;
public IObjectSet<loja> Lojas { get {
if(lojas == null) lojas = CreateObjectSet<loja>();
return lojas;
}
}
}
</loja></loja></loja></produto></produto></produto>
E isto é tudo que precisamos. Já podemos trabalhar com nossas entidades de forma a terem a relação Many-to-Many feita e funcionando.Criei uma aplicação console para demonstrar isso. O método abaixo faz algumas inserções no banco, e o resultado da consulta pode ser visto na imagem a seguir:
private
static void InserirNovosProdutosELojas(){
var contexto = new EF4Context();
var produto = new Produto();
produto.Nome = "Produto de Soja";
produto.ValorSugerido = 10;
var produto2 = new Produto();
produto2.Nome = "Produto de tofu";
produto2.ValorSugerido = 10;
var loja = new Loja();
loja.Nome = "Loja do Vinicius";
loja.Cidade = "São Paulo";
loja.ProdutosQueVende.Add(produto);
var loja2 = new Loja();
loja2.Nome = "Loja Vegetariana";
loja2.Cidade = "São Paulo";
loja2.ProdutosQueVende.Add(produto);
loja2.ProdutosQueVende.Add(produto2);
contexto.AddObject("Produtos", produto);
contexto.AddObject("Produtos", produto2);
contexto.AddObject("Lojas", loja);
contexto.AddObject("Lojas", loja2);
contexto.SaveChanges();
Console.ReadKey();
}
Reparem que apenas adicionamos os produtos nas lojas, e não precisamos adicionar as lojas aos produtos também. O Entity Framework é esperto para fazer essa associação.Aqui podemos ver uma saída gráfica das nossas relações:
Bom pessoal, éisso aê. A relação Many-to-Many com POCOs no Entity Framework 4.0 é bastante simples e natural. Não requer passos adicionais e nem complicados.Qualquer dúvida, crítica ou sugestão, deixem seus comentários ou podem escrever email.
Att, Vinicius Quaiato.