none
[Dúvida] Configurar entidades no Entity Framework RRS feed

  • Pergunta

  • Tenho duas entidade, como mostrado abaixo, a primeira de "Perfil" possui uma lista da segunda de "Permissões", está por sua vez possui uma lista dela mesma (Node Pai/Node Filhos). Consegui configurar corretamente Permissões, sendo que ao chamar o node pai ele já trás os nodes filhos. Entretanto perfil está incorreto, ao adicionar a lista de permissões ao perfil, apenas os nodes pai são salvos no banco de dados em uma terceira tabela. Apenas para entender, a minha intenção com isso é criar um menu para a minha aplicação, baseado no perfil de cada usuário.

    Segue as entidades e suas atuais configurações:

    Perfil

    public class Perfil
        {
            public Perfil()
            {
                // ReSharper disable DoNotCallOverridableMethodsInConstructor
                this.Permissoes = new HashSet<Permissao>();
                // ReSharper restore DoNotCallOverridableMethodsInConstructor
            }
    
            #region Propriedades
    
            public int Id { get; set; }
    
            [Required(ErrorMessage = "{0} é obrigatório")]
            [StringLength(30, ErrorMessage = "Máximo de {0} caracteres")]
            public string Nome { get; set; }
    
            [StringLength(100, ErrorMessage = "Máximo de {0} caracteres")]
            public string Descricao { get; set; }
    
            [Required(ErrorMessage = "{0} é obrigatório")]
            [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
            [Display(Name = "Data cadastro")]
            public DateTime DataCadastro { get; set; }
    
            [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
            [Display(Name = "Data atualização")]
            public DateTime? DataAtualizacao { get; set; }
    
            public bool Master { get; set; }
            public bool Publico { get; set; }
    
            public TiposPortal Portal { get; set; }
    
            public int UsuarioCadastroId { get; set; }
            public int? UsuarioAtualizacaoId { get; set; }
    
            #endregion
    
            #region Navegacao
    
            public virtual ICollection<Permissao> Permissoes { get; set; }
            public virtual Usuario UsuarioCadastro { get; set; }
            public virtual Usuario UsuarioAtualizacao { get; set; }
    
            #endregion
        }
    
    public class MapaPerfil : EntityTypeConfiguration<Perfil>
        {
            public MapaPerfil()
            {
                ToTable("Perfil");
    
                //Propriedades
                HasKey(c => c.Id);
                Property(c => c.Nome).HasMaxLength(30).IsRequired();
                Property(c => c.Descricao).HasMaxLength(100).IsOptional();
                Property(c => c.DataCadastro).IsRequired();
                Property(c => c.DataAtualizacao).IsOptional();
                Property(c => c.Master).IsOptional();
                Property(c => c.Publico).IsOptional();
                Property(c => c.Portal).IsOptional();
    
                //Navegacao
                HasMany(c => c.Permissoes).WithMany(p => p.Perfis);
                HasRequired(c => c.UsuarioCadastro).WithMany().HasForeignKey(f => f.UsuarioCadastroId);
                HasOptional(c => c.UsuarioAtualizacao).WithMany().HasForeignKey(f => f.UsuarioAtualizacaoId);
            }
        }
    Permissão
    public class Permissao
        {
            public Permissao()
            {
                // ReSharper disable DoNotCallOverridableMethodsInConstructor
                this.Filhos = new HashSet<Permissao>();
                this.Perfis = new HashSet<Perfil>();
                // ReSharper restore DoNotCallOverridableMethodsInConstructor
            }
    
            #region Propriedades
    
            public int Id { get; set; }
            [StringLength(50, ErrorMessage = "Máximo de {0} caracteres")]
            public string Nome { get; set; }
    
            [StringLength(100, ErrorMessage = "Máximo de {0} caracteres")]
            public string Descricao { get; set; }
    
            public string Action { get; set; }
            public string Controller { get; set; }
            public string Icone { get; set; }
            public int Ordem { get; set; }
            public TiposPortal Portal { get; set; }
    
            public int? ParenteId { get; set; }
            public Permissao Parente { get; set; }
            
            #endregion
    
            #region Navegacao
    
            public virtual ICollection<Permissao> Filhos { get; set; }
            public virtual ICollection<Perfil> Perfis { get; set; }
    
            #endregion
        }
    
    public class MapaPermissao : EntityTypeConfiguration<Permissao>
        {
            public MapaPermissao()
            {
                ToTable("Permissao");
                HasKey(c => c.Id);
                Property(c => c.Nome).HasMaxLength(50).IsRequired();
                Property(c => c.Descricao).HasMaxLength(100).IsOptional();
                Property(c => c.Action).HasMaxLength(100).IsOptional();
                Property(c => c.Controller).HasMaxLength(100).IsOptional();
                Property(c => c.Icone).HasMaxLength(100).IsOptional();
                Property(c => c.Ordem).IsRequired();
                Property(c => c.Portal).IsRequired();
    
                HasOptional(c => c.Parente).WithMany(p => p.Filhos).HasForeignKey(f => f.ParenteId);
                HasMany(c => c.Filhos).WithOptional().HasForeignKey(f => f.ParenteId);
                HasMany(c => c.Perfis).WithMany(p => p.Permissoes);
            }
        }


    • Editado Tabgyn quarta-feira, 12 de março de 2014 18:17
    quarta-feira, 12 de março de 2014 18:15

Todas as Respostas

  • Caro Tabgyn

    Eu vendo assim por cima, isso ai não seria um muitos para muitos, ou seja, um perfil por ter permissões aqui como permissão pode estar em vários perfils ... ???

    Fica ai a pergunta ?


    Fulvio Cezar Canducci Dias

    quinta-feira, 13 de março de 2014 14:51
  • Sim Fúlvio, um perfil tem várias permissões e uma permissão pode existir ou não para vários perfis.

    Minha intenção é construir um componente de TreeView, baseado nas permissões de um determinado perfil, sendo assim gostaria que os objetos fossem construídos de forma a facilitar minha vida lá na frente quando for chamar a TreeView.

    quinta-feira, 13 de março de 2014 19:47
  • Sim Fúlvio, um perfil tem várias permissões e uma permissão pode existir ou não para vários perfis.

    Minha intenção é construir um componente de TreeView, baseado nas permissões de um determinado perfil, sendo assim gostaria que os objetos fossem construídos de forma a facilitar minha vida lá na frente quando for chamar a TreeView.

    Sugestão !!!

    Então monte um muitos para muitos entre: 

    Perfil e Permissao

    tipo: PerfilPermissao aonde nessa tabela terá as chaves das outras duas tipo PerfilId e PermissaoId !!!

    Eu acredito que resolve o seu problema!


    Fulvio Cezar Canducci Dias


    sexta-feira, 14 de março de 2014 00:30
  • Fúlvio, a configuração que eu passei já faz isso, mas como eu disse no primeiro post apenas os nodes pai estão sendo salvos nessa terceira tabela de PerfilPermissao. Ao meu ver ao inserir o Perfil deveria inserir também nessa terceira tabela não apenas os nodes pai, como também os filhos, dessa forma ao selecionar o Perfil, ele carregaria corretamente as Permissões. Acredito que meu problema esteja no mapeamento, falta saber onde.
    sexta-feira, 14 de março de 2014 11:15
  • Acredito que terei que repensar essas duas entidades, analisando aqui, caso fossem salvos os nodes filhos nessa terceira tabela de PerfilPermissao, ao selecionar o perfil ele traria todos os nodes como sendo pai, ele não teria como fazer a distinção entre quem é pai e quem é filho.
    sexta-feira, 14 de março de 2014 11:51
  • Acredito que terei que repensar essas duas entidades, analisando aqui, caso fossem salvos os nodes filhos nessa terceira tabela de PerfilPermissao, ao selecionar o perfil ele traria todos os nodes como sendo pai, ele não teria como fazer a distinção entre quem é pai e quem é filho.

    Dá uma olhada nesse post do meu blog => ele vai te ajudar !!!

    http://fulviocanducci.wordpress.com/?s=muitos

    E esse é o link do Fluent Api de Mapeamento => http://msdn.microsoft.com/en-us/data/jj591620.aspx

    Realmente repense ... !!!


    Fulvio Cezar Canducci Dias

    sexta-feira, 14 de março de 2014 13:06