none
asp.net mvc 5 Relacionamento de Classes RRS feed

  • 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
    sexta-feira, 20 de junho de 2014 18:51

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.

    sexta-feira, 20 de junho de 2014 19:29
  • 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
    segunda-feira, 23 de junho de 2014 11:46

Todas as Respostas

  • Já existe uma reposta para sua pergunta...

    Lá é ASP.net MVC 4, mas segue o mesmo contexto.

    http://social.msdn.microsoft.com/Forums/pt-BR/ed99a0d3-875d-442a-af2a-99ed04a85779/relacionamento-entre-classes-aspnet-mvc-4-c?forum=mvcpt

    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.


    sexta-feira, 20 de junho de 2014 18:55
  • 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

    sexta-feira, 20 de junho de 2014 19:09
  • 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.

    sexta-feira, 20 de junho de 2014 19:29
  • 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
    sábado, 21 de junho de 2014 12:11
  • 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
    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

    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.

    segunda-feira, 23 de junho de 2014 14:24