Usuário com melhor resposta
asp.net mvc 5 Relacionamento de Classes

Pergunta
-
Boa tarde galera, estou com uma dúvida que embora haja muita explicação na WEB, mas realmente não consigo compreender de como Fazê-la.
Problema: Peguei um sistema para dar suporte e efetuar melhorias, e existem as classes abaixo relacionadas (Sim, estão assim mesmo, com certeza vamos alterar ao longo do tempo)
public partial class ItemCad { [Key] public int id { get; set; } public string descricao { get; set; } } public partial class Venda { [Key] public int nr_pedido { get; set; } public int cd_cadastro { get; set; } public decimal vl_venda { get; set; } } public partial class VendaValor { [Key] public int nr_pedido { get; set; } public decimal vl_venda { get; set; } public decimal vl_desconto { get; set; } public decimal vl_final { get; set; } } public partial class VendaItem { [Key, Column(Order = 0)] public int nr_pedido_item { get; set; } [Key, Column(Order = 1)] public int id_item { get; set; } public decimal qt_pedida { get; set; } public decimal vl_unitario { get; set; }
}
Dentro do projeto existe um override no OnModelCreating, e minha dúvida é como relacioná-las neste arquivo ?
protected override void OnModelCreating(DbModelBuilder modelBuilder) { //codigos para o relacionamento }
1º- Relacionar ItemCad e VendaItem (N : N), sendo que a coluna possuem Nomes Diferentes ?
2º- Relacionar Venda e VendaItem (1 : N), sendo que a coluna possuem Nomes Diferentes ?
3º- Relacionar Venda e VendaValor (1 : 1), sendo que a coluna POSSUEM o mesmo nome.
Gostaria de relacionar com algo parecido abaixo, mas principalmente entender o relacionamento, eu sei que existe o MAP, mas não sei como usá-lo.
modelBuilder.Entity<NotaItem>().HasRequired(a => a.Nota).WithMany().HasForeignKey(u => new { u.idempresa, u.serie, u.nota });
Eu pesquisei por ai(via google), mas não compreendi (maioria em inglês), ou não soube procurar direito...
Alguém tem a paciência para me explicar detalhadamente este processo ?
Obrigado
Isco Sistemas José Luiz Borges
- Editado Jose Luiz Borges sexta-feira, 20 de junho de 2014 18:52 erro de digitação
Respostas
-
José Luiz, beleza cara.
O caminho é esse mesmo que você quer.
Não sei qual versão você está utilizando do VS nem do EF, mas o EF6 já te traz um esquema show de bola, que é, você gerar o CodeFirst utilizando seu BD.
Relacionamento N : N
modelBuilder.Entity<Profiles>() .HasMany(e => e.Roles) .WithMany(e => e.Profiles) .Map(m => m.ToTable("Profiles_Roles").MapLeftKey("ProfileId").MapRightKey("RoleId"));
Na classe tenho o seguinte código:
public Profiles() { Roles = new HashSet<Roles>(); } [Key] public int ProfileId { get; set; } [Required] [StringLength(150)] public string ProfileName { get; set; } public virtual ICollection<Roles> Roles { get; set; } }
O codigo a cima se repete para os outros relacionamentos.
Exemplo rapido de N : 1
public Empresas() { Users = new HashSet<Users>(); } [Key] public int IdEmpresa { get; set; } [Required] [StringLength(100)] public string nomeEmpresa { get; set; } public virtual ICollection<Users> Users { get; set; }
Classe User:
public class User{ [ForeignKey("IdEmpresa")] public virtual Empresas Empresas { get; set; } }
Lembrando que: Para o relacionamento N : N ambas as classes devem conter as propriedade virtual e o hashset definido, conforme apresentei mais a cima.
Olhe esse link e veja se ajuda:
http://carloscds.net/ ele fala muita coisa sobre EF.
Abraço.
- Sugerido como Resposta Jean Carlos Galhardi sábado, 21 de junho de 2014 11:57
- Marcado como Resposta Jose Luiz Borges segunda-feira, 23 de junho de 2014 11:46
-
Obrigado a todos,
segue material bom para estudos sobre o assunto
http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx
http://msdn.microsoft.com/en-US/data/jj591620
http://msdn.microsoft.com/en-US/data/jj591617
Isco Sistemas José Luiz Borges
- Marcado como Resposta Jose Luiz Borges segunda-feira, 23 de junho de 2014 11:47
Todas as Respostas
-
Já existe uma reposta para sua pergunta...
Lá é ASP.net MVC 4, mas segue o mesmo contexto.
Abraço.
Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
- Editado Jean Carlos Galhardi sexta-feira, 20 de junho de 2014 18:56
-
opa.. obrigado por responder... já tinha visto este post
mas eu queria fazer o relacionamento dentro do OnModelCreating utilizando algo parecido com este
modelBuilder.Entity<Nota>().HasRequired(a => a.Cadastro).WithMany().HasForeignKey(u => u.cd_cadastro);
Isco Sistemas José Luiz Borges
-
José Luiz, beleza cara.
O caminho é esse mesmo que você quer.
Não sei qual versão você está utilizando do VS nem do EF, mas o EF6 já te traz um esquema show de bola, que é, você gerar o CodeFirst utilizando seu BD.
Relacionamento N : N
modelBuilder.Entity<Profiles>() .HasMany(e => e.Roles) .WithMany(e => e.Profiles) .Map(m => m.ToTable("Profiles_Roles").MapLeftKey("ProfileId").MapRightKey("RoleId"));
Na classe tenho o seguinte código:
public Profiles() { Roles = new HashSet<Roles>(); } [Key] public int ProfileId { get; set; } [Required] [StringLength(150)] public string ProfileName { get; set; } public virtual ICollection<Roles> Roles { get; set; } }
O codigo a cima se repete para os outros relacionamentos.
Exemplo rapido de N : 1
public Empresas() { Users = new HashSet<Users>(); } [Key] public int IdEmpresa { get; set; } [Required] [StringLength(100)] public string nomeEmpresa { get; set; } public virtual ICollection<Users> Users { get; set; }
Classe User:
public class User{ [ForeignKey("IdEmpresa")] public virtual Empresas Empresas { get; set; } }
Lembrando que: Para o relacionamento N : N ambas as classes devem conter as propriedade virtual e o hashset definido, conforme apresentei mais a cima.
Olhe esse link e veja se ajuda:
http://carloscds.net/ ele fala muita coisa sobre EF.
Abraço.
- Sugerido como Resposta Jean Carlos Galhardi sábado, 21 de junho de 2014 11:57
- Marcado como Resposta Jose Luiz Borges segunda-feira, 23 de junho de 2014 11:46
-
Opa.. obrigado por responder...
é isso que eu quero, só não entendi esta parte, poderia me explicar ?
N : N eU Faço assim ?
modelBuilder.Entity<VendaItem>() .HasMany(e => e.Item) .WithMany(e => e.VendaItem) .Map(m => m.ToTable("VendaItem_Item").MapLeftKey("id_item").MapRightKey("id"));
ou faco assim ?
modelBuilder.Entity<Item>() .HasMany(e => e.VendaItem) .WithMany(e => e.Item) .Map(m => m.ToTable("Item_VendaItem").MapLeftKey("id").MapRightKey("id_item"));
A linha toTable tem o nome Item_VendaItem ou VendaItem_Item mas estas tabelas não existem, é certo fazer assim mesmo ?
"O relacionamento N : N ambas as classes devem conter as propriedade virtual e o hashset definido, conforme apresentei mais a cima."
E nos outros relacionamentos não precisa ter o virtual e o hashset ?
Isco Sistemas José Luiz Borges
- Marcado como Resposta Jose Luiz Borges segunda-feira, 23 de junho de 2014 11:46
- Não Marcado como Resposta Jose Luiz Borges segunda-feira, 23 de junho de 2014 11:46
-
Obrigado a todos,
segue material bom para estudos sobre o assunto
http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx
http://msdn.microsoft.com/en-US/data/jj591620
http://msdn.microsoft.com/en-US/data/jj591617
Isco Sistemas José Luiz Borges
- Marcado como Resposta Jose Luiz Borges segunda-feira, 23 de junho de 2014 11:47
-
Obrigado a todos,
segue material bom para estudos sobre o assunto
http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx
http://msdn.microsoft.com/en-US/data/jj591620
http://msdn.microsoft.com/en-US/data/jj591617
Isco Sistemas José Luiz Borges
Sei que seu problema foi resolvido e me desculpe a demora, outros tipos de relacionamentos precisam sim do virtual, no meu aqui o hashset não tem não.
No meu caso do N : N eu utilizo uma tabela de relacionamento, por isso o
modelBuilder.Entity<Profiles>() .HasMany(e => e.Roles) // Tabela .WithMany(e => e.Profiles) // Tabela .Map(m => m.ToTable("Profiles_Roles").MapLeftKey("ProfileId").MapRightKey("RoleId")); // Definindo as keys
Sem contar que nessa tabela defino os dois Id's como chama, e crio uma chave composta desses dois Id's para que o EF entenda.
Abraço.