Inquiridor
[Dúvida] Configurar entidades no Entity Framework

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
Todas as Respostas
-
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.
-
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!
- Editado 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.
-
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.
-
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