Usuário com melhor resposta
Dúvida ao mapear tabelas com entity framework

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
PedidoOu 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...
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- Marcado como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 12:56
-
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- Marcado como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 12:56
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- Marcado como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 12:56
-
-
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- Marcado como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 12:56
-
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, SituacaoAgradeço pela ajuda..
- Marcado como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 12:56
- Não Marcado como Resposta Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator segunda-feira, 1 de outubro de 2012 12:56
-
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 -
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 -
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
- Editado Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator quinta-feira, 30 de agosto de 2012 11:38