• Follow us on Twitter
  • Join our Facebook Group
  • Join me on Google Plus
  • Add me on Linkedin
  • RSS

  • Home
  • Séries
    • Entity Framework
    • Minhas Palestras
    • ASP .NET MVC
  • Meus Repositórios
    • CodePlex
    • GitHub

Blog - Latest News

Chave estrangeira e Associação Independente no Entity Framework

1 Comment/ in Desenvolvimento, Entity Framework / by Cleyton Ferrari
5 de maio de 2012

Neste artigo é apresentada a utilização do uso das associações por Foreign Key (Chave Estrangeira) e Independent Associations (Associação independente), demonstrado através de exemplo prático.

Baixe a versão do código demonstrado neste artigo no CodePlex http://efkey.codeplex.com 
Baixe a versão do código demonstrado neste artigo no GitHub https://github.com/cleytonferrari/efkey

Nas primeiras versões do Entity Framework só era possível fazer um único tipo de associação entre as entidades, a Independet Associations, esta primeira abordagem de relacionamento entre as entidades era totalmente orientada a objeto, onde a relação entre dois ou mais objetos é feita através de referencias. Por exemplo, um objeto Produto que possui dentro dele (associação) outro objeto Categoria.

public class Produto
{
    public int Id { get; set; }
    public string Descricao { get; set; }
    public Categoria Categoria { get; set; }
}

O problema deste tipo de associação é que o Entity Framework torna, por vezes, muito complexa a sua implementação, seguindo o raciocínio do exemplo do Produto acima, para adicionar um novo produto, é preciso fazer uma busca nas categorias, achar um objeto categoria e associar ele (com todas as suas dependências/propriedades, no caso a propriedade UnidadeDeMedida) a este produto. E esta complexidade tende a aumentar em objetos muito complexos, que possuam vários outros objetos dentro.

class Program
{
   static void Main()
   {
       var meucontexto = new MeuContexto();
       var produto = new Produto();
       produto.Descricao = "Arroz";
       produto.Categoria = meucontexto.Categorias.Include("UnidadeDeMedida").ToList().FirstOrDefault();
       meucontexto.Produtos.Add(produto);
       meucontexto.SaveChanges();
   }
}

Observe, que foi solicitado ao Entity Framework para incluir na sua busca, a UnidadeDeMedida, que é uma associação que existe entre as Classes Categoria e UnidadeDeMedida, como é demonstrado abaixo.

public class Categoria
{
public int Id { get; set; }
public string Nome { get; set; }
public UnidadeDeMedida UnidadeDeMedida { get; set; }
}

public class UnidadeDeMedida
{
public int Id { get; set; }
public string Descricao { get; set; }
public string Abreviacao { get; set; }
}

Logo, se tenho uma classe que possui varias associações, é necessário trazer todas estas associações “secundárias” para realizar uma simples associação entre Produto e Categoria.

Já no Entity Framework 4 ou superior, o time de desenvolvimento do Entity Framework incluiu um novo tipo de associação onde o modelo conceitual inclui a propriedade do tipo Foreign Key, para definir as associações entre as entidades. Voltando ao nosso exemplo do Produto, agora ao invés de somente ter uma propriedade do tipo Categoria, o objeto Produto teria outra propriedade do tipo int, por convenção, o nome da propriedade Foreign Key é o nome da Propriedade Complexa associada, seguida pelo sufixo Id (no caso CategoriaId), que seria usada como Foreign Key (chave estrangeira), e nesta abordagem, na hora de cadastrar um novo produto, bastaria passar o Id da Categoria, para essa propriedade do tipo int, e a associação estaria feita, o Entity Framework se encarregaria do resto.

class Program
{
    static void Main()
    {
        var meucontexto = new MeuContexto();
        var produto = new Produto();
        produto.Descricao = "Arroz";
        produto.CategoriaId = meucontexto.Categorias.ToList().FirstOrDefault().Id;
        meucontexto.Produtos.Add(produto);
        meucontexto.SaveChanges();
    }
}

public class Produto
{
    public int Id { get; set; }
    public string Descricao { get; set; }
    public int CategoriaId { get; set; }
    public Categoria Categoria { get; set; }
}

Repare que neste exemplo, não é mais necessário a inclusão da UnidadeDeMedida, que esta associada a categoria, para que se possa criar uma associação entre Produto e Categoria.

Este artigo não tem o propósito de debater os meandros desta abordagem se ela é boa ou não, se quebra ou não as regras da orientação objeto, uma vez que se tem a Foreign Key para fazer associação entre objetos, o próprio time de desenvolvedores do Entity Framework escreveu um artigo sobre isso, que diz que essa decisão deve ser tomada pelo desenvolvedor.

Verdade seja dita, o uso de Foreign Key diminui bastante a complexidade do código, o que torna muito mais fácil a manutenção futura, uma vez que não é preciso trazer todo o emaranhado de objetos complexo associadas a uma entidade, para fazer uma simples associação entre esses objetos, sem levar em conta o desempenho nas consultas realizadas para essas associações.

Exemplo completo, para referencia:

using System;
using System.Data.Entity;
using System.Linq;

namespace ChaveEstrangeira
{
    class Program
    {
        static void Main()
        {
            var meucontexto = new MeuContexto();
            var categoria = new Categoria();
            categoria.Nome = "Alimentos";
            categoria.UnidadeDeMedida = new UnidadeDeMedida
                                            {
                                                Abreviacao = "PCT",
                                                Descricao = "Pacote"
                                            };

            meucontexto.Categorias.Add(categoria);
            meucontexto.SaveChanges();

            var produto = new Produto();
            produto.Descricao = "Arroz";
            produto.CategoriaId = meucontexto.Categorias.ToList().FirstOrDefault().Id;
            //produto.CategoriaId = 1; //Caso saiba o id, basta passar somente o Id.
            meucontexto.Produtos.Add(produto);
            meucontexto.SaveChanges();

            //Busca no contexto o produto cadastrado
            var produtoRetornado = meucontexto.Produtos.Include("Categoria").ToList().FirstOrDefault();
            Console.WriteLine(produtoRetornado.Categoria.Nome);
        }
    }

    public class Produto
    {
        public int Id { get; set; }
        public string Descricao { get; set; }
        public int CategoriaId { get; set; }
        public Categoria Categoria { get; set; }
    }

    public class Categoria
    {
        public int Id { get; set; }
        public string Nome { get; set; }
        public int UnidadeDeMedidaId { get; set; }
        public UnidadeDeMedida UnidadeDeMedida { get; set; }
    }

    public class UnidadeDeMedida
    {
        public int Id { get; set; }
        public string Descricao { get; set; }
        public string Abreviacao { get; set; }
    }

    public class MeuContexto : DbContext
    {
        public DbSet<Produto>; Produtos { get; set; }
        public DbSet<Categoria> Categorias { get; set; }
    }
}

 Para Saber mais

  • Foreign Keys in the Entity Framework
  • Foreign key vs Independent associations in EF 4
Tags: EF
← ALM Summit Brasil 2012
Larry Page, presidente do Google →
Related Posts
Vídeo-Aula ASP.Net MVC na prática – Parte 9-1
Vídeo-Aula ASP.Net MVC na prática – Parte 9-2
Vídeo-Aula Entity Framework Migrations na Prática – Parte 1
Vídeo-Aula Entity Framework Migrations na Prática – Parte 2

Google+

376Follower
Popular
  • Vídeo-Aula ASP.Net MVC na prática – Parte 1junho 18, 2012, 9:13 pm
  • Validação de Data e Moeda (ASP.Net MVC + JQuery Validation)...janeiro 31, 2013, 11:27 am
  • Vídeo-Aula ASP.Net MVC na prática – Parte 6janeiro 12, 2013, 3:50 pm
  • Rotativa W7 gerando relatórios em PDF no ASP.Net MVCdezembro 26, 2012, 5:53 pm
  • Vídeo-Aula ASP.Net MVC na prática – Parte 9-1setembro 27, 2013, 6:00 pm
Recent
  • Visual StudioVisual Studio 2015julho 20, 2015, 7:57 pm
  • MySQL com ASP.Net MVCmaio 6, 2015, 4:16 pm
  • Vídeo-Aula ASP.Net MVC na prática – Parte 9-3março 29, 2014, 3:14 pm
  • Vídeo-Aula ASP.Net MVC na prática – Parte 9-2janeiro 26, 2014, 9:56 am
  • Vídeo-Aula ASP.Net MVC na prática – Parte 9-1setembro 27, 2013, 6:00 pm
Comments
  • ótimo, agora concidera vírgula como decimal, porém a...janeiro 31, 11:27 am by gilmar
  • Parabéns pelo artigo Cleyton, para utilizar a sua solução...janeiro 31, 11:27 am by Braytiner Heggendorn
  • Certo Danilo! Muito obrigado pela dica!!janeiro 31, 11:27 am by José Furtado
  • Olá José, tudo bem? Então, trabalhando em um projeto...janeiro 31, 11:27 am by Danilo Miranda
  • Olá Danilo! Hoje enfrento o mesmo problema que você, já...janeiro 31, 11:27 am by José Furtado
Tags
.net alsummit asp.net clean code complexidade comunidade CSharp EF evento hyper-v IISExpress jQuery metro MVC MySQL nuget razor Rotativa W7 SignalR SQL TDD TechEd Testes Unitários TFS11 TFS2012 Visual Studio VS2012 Vídeo-Aula windows8 wp7

Series

  • ASP.Net MVC (16)
  • Entity Framework (4)
  • Minhas Palestras (1)

Interesting links

Besides are some interesting links for you! Enjoy your stay :)

Últimos Comentários

  • gilmar em Validação de Data e Moeda (ASP.Net MVC + JQuery Validation) em Português
  • Braytiner Heggendorn em Validação de Data e Moeda (ASP.Net MVC + JQuery Validation) em Português
© Copyright - Cleyton Ferrari - Wordpress Theme by Kriesi.at