none
Dúvida ao mapear tabelas com entity framework RRS feed

  • Pergunta

  • Olá Galera, estou com uma pulga na cabeça em relação ao entity framework. Pois tenho as seguintes tabelas no banco:

    Produto
    ProdutoPedido
    Pedido

    Ou seja é um relacionamento n-n de produto e pedido que gerou a tabela produtopedido. Gostaria de saber como posso fazer pra mapear isso com entity framework direto no código, criando o contexto, etc...

    quinta-feira, 19 de julho de 2012 06:20

Respostas

  • Olá Jonathan,

    Acredito que vc esteja utilizando o Entity Framework CodeFirst para fazer este mapeamento.

    Nesta thread (http://social.msdn.microsoft.com/Forums/pt-BR/adoptpt/thread/4b986b32-1381-4bf1-8eee-2e964ac1c6e6c) existe uma dúvida mto parecida com a sua.

    Um esboço do seu código seria algo como:

    public class DataContext : DbContext
    {
        public DataContext()
            : base(@"SUA CONNECTION STRING")
        {
            Database.SetInitializer<DataContext>(null);
        }
        public DbSet<produto> produtos { get; set; }
        public DbSet<pedido> pedidos { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<produto>()
                        .ToTable("tabelaproduto");
            modelBuilder.Entity<produto>()
                        .HasKey(e => e.id_produto);
            modelBuilder.Entity<pedido>()
                        .ToTable("tabelapedido");
            modelBuilder.Entity<pedido>()
                        .HasKey(e => e.id_pedido);
            modelBuilder.Entity<pedido>()
                        .HasMany(e => e.produtos)
                        .WithMany(e => e.pedidos)
                        .Map(m =>
                        {
                            m.ToTable("produtopedido");
                            m.MapLeftKey("id_produto");
                            m.MapRightKey("id_pedido");
                        }); 
                
            base.OnModelCreating(modelBuilder);
        }
    }

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 19 de julho de 2012 13:33
    Moderador
  • Olá Jonathan,

    Neste caso, sua classe tabela ProdutoPedido possui algum atributo além dos IDs do Pedidos e do Produto.

    Acredito que vc irá enfrentar este cenário, pois provavelmente sua tabela ProdutoPedido deve ter os campos Quantidade e Valor (por exemplo).

    Neste caso, acredito que é necessário criar esta classe, e seu mapeamento deve ser algo como:

    public class DataContext : DbContext
    {
        public DataContext()
            : base(@"SUA CONNECTION STRING")
        {
            Database.SetInitializer<DataContext>(null);
        }
        public DbSet<produto> produtos { get; set; }
        public DbSet<pedido> pedidos { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<produto>()
                        .ToTable("tabelaproduto");
            modelBuilder.Entity<produto>()
                        .HasKey(e => e.id_produto);
            modelBuilder.Entity<pedido>()
                        .ToTable("tabelapedido");
            modelBuilder.Entity<pedido>()
                        .HasKey(e => e.id_pedido);
            modelBuilder.Entity<produtopedido>()
                        .ToTable("produtopedido");
            modelBuilder.Entity<produtopedido>()
                        .HasKey(e => e.id_produto_pedido);
            modelBuilder.Entity<produtopedido>()
                        .HasRequired(b => b.produto)
                        .WithMany() 
                        .HasForeignKey(b => b.produtoid);
            modelBuilder.Entity<produtopedido>()
                        .HasRequired(b => b.pedido)
                        .WithMany() 
                        .HasForeignKey(b => b.pedidoid);
                
            base.OnModelCreating(modelBuilder);
        }
    }

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 19 de julho de 2012 17:22
    Moderador

Todas as Respostas

  • Olá Jonathan,

    Acredito que vc esteja utilizando o Entity Framework CodeFirst para fazer este mapeamento.

    Nesta thread (http://social.msdn.microsoft.com/Forums/pt-BR/adoptpt/thread/4b986b32-1381-4bf1-8eee-2e964ac1c6e6c) existe uma dúvida mto parecida com a sua.

    Um esboço do seu código seria algo como:

    public class DataContext : DbContext
    {
        public DataContext()
            : base(@"SUA CONNECTION STRING")
        {
            Database.SetInitializer<DataContext>(null);
        }
        public DbSet<produto> produtos { get; set; }
        public DbSet<pedido> pedidos { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<produto>()
                        .ToTable("tabelaproduto");
            modelBuilder.Entity<produto>()
                        .HasKey(e => e.id_produto);
            modelBuilder.Entity<pedido>()
                        .ToTable("tabelapedido");
            modelBuilder.Entity<pedido>()
                        .HasKey(e => e.id_pedido);
            modelBuilder.Entity<pedido>()
                        .HasMany(e => e.produtos)
                        .WithMany(e => e.pedidos)
                        .Map(m =>
                        {
                            m.ToTable("produtopedido");
                            m.MapLeftKey("id_produto");
                            m.MapRightKey("id_pedido");
                        }); 
                
            base.OnModelCreating(modelBuilder);
        }
    }

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 19 de julho de 2012 13:33
    Moderador
  • Mas em relação ao objetos, eu preciso criar uma classe produtoPedido igual a do banco ?
    quinta-feira, 19 de julho de 2012 17:08
  • Olá Jonathan,

    Neste caso, sua classe tabela ProdutoPedido possui algum atributo além dos IDs do Pedidos e do Produto.

    Acredito que vc irá enfrentar este cenário, pois provavelmente sua tabela ProdutoPedido deve ter os campos Quantidade e Valor (por exemplo).

    Neste caso, acredito que é necessário criar esta classe, e seu mapeamento deve ser algo como:

    public class DataContext : DbContext
    {
        public DataContext()
            : base(@"SUA CONNECTION STRING")
        {
            Database.SetInitializer<DataContext>(null);
        }
        public DbSet<produto> produtos { get; set; }
        public DbSet<pedido> pedidos { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<produto>()
                        .ToTable("tabelaproduto");
            modelBuilder.Entity<produto>()
                        .HasKey(e => e.id_produto);
            modelBuilder.Entity<pedido>()
                        .ToTable("tabelapedido");
            modelBuilder.Entity<pedido>()
                        .HasKey(e => e.id_pedido);
            modelBuilder.Entity<produtopedido>()
                        .ToTable("produtopedido");
            modelBuilder.Entity<produtopedido>()
                        .HasKey(e => e.id_produto_pedido);
            modelBuilder.Entity<produtopedido>()
                        .HasRequired(b => b.produto)
                        .WithMany() 
                        .HasForeignKey(b => b.produtoid);
            modelBuilder.Entity<produtopedido>()
                        .HasRequired(b => b.pedido)
                        .WithMany() 
                        .HasForeignKey(b => b.pedidoid);
                
            base.OnModelCreating(modelBuilder);
        }
    }

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 19 de julho de 2012 17:22
    Moderador
  • Exato, possui mais campos sim. E também gostaria de saber sobre as outras tabelas. Na minha lógica a tabela produto tem somente seus atributos sem nenhuma relação, a tabela produtoPedido tem um atributo do tipo produto e um pedido. E a tabela pedido não possui nenhuma relação também, você concorda comigo? O que eu não estou conseguindo é passar a lógica do banco para a aplicação.

    public class Produto    {        
        public int IdProduto { get; set; }        
        public string Nome { get; set; }        
        public double PrecoCusto { get; set; }        
        public double PrecoVenda { get; set; }        
        public char Situacao { get; set; }    
    }


    public class Pedido
        {
            public int IdPedido { get; set; }
    
            public DateTime DataPedido { get; set; }
    
            public DateTime DataEntrega { get; set; }
    
            public double ValorTotal { get; set; }
    
            public char Situacao { get; set; }
        }


    public class ProdutoPedido
        {
            public int IdProdutoPedido { get; set; }
    
            public Pedido Pedido { get; set; }
    
            public Produto Produto { get; set; }
    
            public int Quantidade { get; set; }
    
            public double PrecoUnitario { get; set; }
    
            public char Situacao { get; set; }
        }


    Essa são as classes que tenho aqui na aplicação.

    E no banco tenho a seguinte estrutura:

    Produto: IDProduto, Nome, PrecoCusto, PrecoVenda, Situacao

    ProdutoPedido: IDProdutoPedido, IDPedido, IDProduto, Quantidade, PrecoUnitario, Situacao

    Pedido: IDPedido, DataPedido, DataEntrega, ValorTotal, Situacao

    Agradeço pela ajuda..

    quinta-feira, 19 de julho de 2012 18:06
  • Olá Jonathan,

    Tente baixar o Entity Framework Power Tools, ele irá construir o mapeamento do Code First a partir da sua base de dados.

    Link para baixar o EF Power Tools: http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

    Post sobre o assunto: http://blog.fujiy.net/post/entity-framework-power-tools-ctp1

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 19 de julho de 2012 18:28
    Moderador
  • Olá Jonathan,

    Alguma evolução nesta questão?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    quinta-feira, 26 de julho de 2012 17:47
    Moderador
  • Jonathan,

    Alguma evolução nesta questão?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil


    quinta-feira, 30 de agosto de 2012 11:37
    Moderador