Vinicius Quaiato

{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}

Entity Framework 4.0: Utilizando many-to-many com POCOs


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:

Modelo de Classes Entity Framework 4.0

Feito isso vamos criar uma associação entre nossas entidades, como pode ser visto abaixo:

Criando associação no modelo do EF 4.0

Definindo a Associacao Many-To_Many no EF 4.0

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; }
    }
}

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; }
    }
}

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;
        }
    }
}

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:

Resultado da relação Many-to-Many

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.

Voltar

Fork me on GitHub