none
Como salvar objeto com relacionamento 2 niveis no Session RRS feed

  • Pergunta

  • Bom dia, 

    Estou com uma dificuldade onde eu preciso salvar um objeto do tipo usuário na sessão, porém ele tem relacionamento Icollection<UsuarioPerfil>, relaciona Usuário x Perfil, e esta com Perfil, que relaciona Icollection<PerfilAcao>, e esta com Perfil e Ação. O problema é que ao salvar no session esta com todo objeto montado, mas quando recupero, ele não vem todo este relacionamento, ai tenho problemas para checar as ações relacionadas ao perfil, associada ao usuário, conforme na ultimo bloco de código. Até poderia no método GetLoggedUser, pegar o código do usuário que vem ali e fazer uma consulta no banco e resgatar o objeto completo com relacionamento, mas como é um método static eu não consigo, e para isso teria que alterar a assinatura do método, impactando em todo o sistema. Existe alguma forma que eu consiga resolver esta dificuldade?

    [Table("USUARIO")]
        public class UsuarioInfo : BaseMultiTenantInfo
        {
            [Key]
            [Column("cd_usuario")]
            public int CdUsuario { get; set; }
    
            [Column("ds_nome")]
            [LocalizedDisplayName("Nome")]
            [LocalizedRequired]
            [LocalizedStringLength(80, ErrorMessage = "Nome do usuário deve possuir no máximo 80 caracteres")]
            [LocalizedGrid(1, CanOrder = true, CanSearch = true, DefaultOrder = DefaultOrderType.ASC)]
            [LocalizedDetail("Informacoes Basicas", 1, 1)]
            [StringLength(80, ErrorMessage = "Usuário deve possuir no máximo 100 caracteres")]
            [Required(ErrorMessage = "Nome deve ser informado", AllowEmptyStrings = false)]
            public string DsNome { get; set; }
    
            [Column("ds_usuario")]
            [IndexAttribute("IX_ds_usuario", 1, IsUnique = true)]
            [LocalizedRequired]
            [LocalizedDisplayName("Usuário")]
            [LocalizedGrid(2, CanOrder = true, CanSearch = true)]
            [LocalizedDetail("Informacoes Basicas", 1, 2)]
            [StringLength(50, ErrorMessage = "Usuário deve possuir no máximo 50 caracteres")]
            [Required(ErrorMessage = "Usuário deve ser informado", AllowEmptyStrings = false)]
            public string DsUsuario { get; set; }
    
            [Column("ds_senha")]
            [LocalizedDisplayName("Senha")]
            [DataType(DataType.Password)]
            [StringLength(50, ErrorMessage = "Senha do usuário deve possuir no máximo 50 caracteres")]
            [Required(ErrorMessage = "Senha deve ser informado", AllowEmptyStrings = false)]
            public string DsSenha { get; set; }
    
            [Column("ds_email")]
            [LocalizedRequired]
            [LocalizedDisplayName("E-mail")]
            [LocalizedGrid(3, CanOrder = true, CanSearch = true)]
            [StringLength(100, ErrorMessage = "Email deve possuir no máximo 100 caracteres")]
            [Required(ErrorMessage = "Email deve ser informado", AllowEmptyStrings = false)]
            [LocalizedRegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessageResourceName = "Email inválido")]
            public string DsEmail { get; set; }
                           
            [Column("st_sys_admin")]        
            [DefaultValue(false)]
            public bool IsSysAdmin { get; set; }
    
            public virtual ICollection<UsuarioPerfilInfo> UsuarioPerfil { get; set; }
    
            [NotMapped]
            public string PerfisValues { get; set; }
    
            [NotMapped]
            [LocalizedDisplayName("Perfis")]
            [LocalizedListDetailAttribute("Informacoes Basicas", 1, 3)]
            public List<string> PerfilList { get; set; }
        }
     [Table("USUARIO_PERFIL")]
        public class UsuarioPerfilInfo : BaseInfo
        {
            [Key]
            [Column("cd_usuario", Order = 1)]
            public int CdUsuario { get; set; }
    
            [ForeignKey("CdUsuario")]
            public virtual UsuarioInfo Usuario { get; set; }
    
            [Key]
            [Column("cd_perfil", Order = 2)]
            public int CdPerfil { get; set; }
    
            [ForeignKey("CdPerfil")]
            public virtual PerfilInfo Perfis { get; set; }
        }

     [Table("PERFIL")]
        public class PerfilInfo : BaseMultiTenantInfo
        {
             [Key]
             [Column(name: "cd_perfil")]
             public int CdPerfil { get; set; }
    
             [Column("ds_perfil")]
             [Display(Name = "PERFIL")]
             [LocalizedGrid(1, CanOrder = true, CanSearch = true, DefaultOrder = DefaultOrderType.ASC)]
             [LocalizedDisplayName("Perfil")]
             [LocalizedDetail("Informacoes Basicas", 1, 1)]
             [StringLength(30, ErrorMessage = "O Perfil deve possuir no máximo 50 caracteres")]
             public string DsPerfil { get; set; }
    
             public virtual ICollection<PerfilAcaoInfo> PerfilAcoes { get; set; }
            
        }

    [Table("PERFIL_ACAO")]
        public class PerfilAcaoInfo : BaseInfo
        {
            [Key]
            [Column("cd_perfil_acao")]
            public int CdPerfilAcao { get; set; }      
    
            public virtual PerfilInfo Perfil { get; set; }
            
            public virtual AcaoInfo Acao { get; set; }
    
            
        }
     [Table("ACAO")]
        public class AcaoInfo : BaseInfo
        {
            [Key]
            [Column("cd_acao")]
            public int CdAcao { get; set; }
    
            [Column("ds_acao")]
            [Display(Name = "ACAO")]
            [LocalizedGrid(1, CanOrder = true, CanSearch = true, DefaultOrder = DefaultOrderType.ASC)]
            [LocalizedDisplayName("Ação")]
            [LocalizedDetail("Informacoes Basicas", 1, 1)]
            [StringLength(30, ErrorMessage = "A Ação deve possuir no máximo 50 caracteres")]
            public string DsAcao { get; set; }
    
            public virtual ICollection<PerfilAcaoInfo> PerfilAcoes { get; set; }
        }

     public bool UserAuthentication(string usuario, string senha)
            {
                bool result = false;
    
                string senhaCriptografada = null;
                try
                {
                    senhaCriptografada = (new SmartShare.Cryptography.Crypto()).Encrypt(senha, "VwcC2ubJtlO2ZcJ1bTXO7LRIb3udKted");
                }
                catch (Exception) { }
    
                if (senhaCriptografada != null)
                {
                    string senhaHash = SmartShare.Cryptography.Crypto.GerarHash(senhaCriptografada);
    
                    if (senhaHash != null)
                    {
                        this.DbContext.DisableFilter(SmartShareITCContext.TENANT_FILTER);
    
                        var usuarioAutenticado = this.DbContext.Usuarios.Include("UsuarioPerfil")
                            .Where(x => x.DsUsuario == usuario && x.DsSenha == senhaHash).SingleOrDefault();
    
                        if (usuarioAutenticado != null)
                        {
                            System.Web.HttpContext.Current.Session["UsuarioAutenticado"] = usuarioAutenticado;
                            
                            SmartShareITCContext.CurrentTenant = usuarioAutenticado.Tenant;
    
                            result = true;
                        }
                    }
                }
    
                return result;
            }
    
            public static UsuarioInfo GetLoggedUser()
            {
                UsuarioInfo usuario = null;
                
                usuario = System.Web.HttpContext.Current.Session["UsuarioAutenticado"] as UsuarioInfo;
                
                return usuario;
            }



     

    Atenciosamente, Ezequiel S. Daniel

    quinta-feira, 17 de dezembro de 2015 12:14

Respostas

  • Boa tarde,

    Colocar objetos em session nunca é uma boa ideia.

    http://eduardopires.net.br/2015/04/pense-duas-vezes-antes-de-utilizar-sessions/

    Mesmo assim a melhor forma de resolver isso é convertendo o objeto em json e depois voltando ele para o estado original

       
    using System.Runtime.Serialization.Json;
    using System.Text;
      
      public static string Serialize<T>(T obj)
            {
                var serializer = new DataContractJsonSerializer(obj.GetType());
                var ms = new MemoryStream();
                serializer.WriteObject(ms, obj);
                var retVal = Encoding.UTF8.GetString(ms.ToArray());
                return retVal;
            }
    
            public static T Deserialize<T>(string json)
            {
                var obj = Activator.CreateInstance<T>();
                var ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
                var serializer = new DataContractJsonSerializer(obj.GetType());
                obj = (T)serializer.ReadObject(ms);
                ms.Close();
                return obj;
            }


    terça-feira, 26 de janeiro de 2016 18:38

Todas as Respostas

  • Boa tarde,

    Colocar objetos em session nunca é uma boa ideia.

    http://eduardopires.net.br/2015/04/pense-duas-vezes-antes-de-utilizar-sessions/

    Mesmo assim a melhor forma de resolver isso é convertendo o objeto em json e depois voltando ele para o estado original

       
    using System.Runtime.Serialization.Json;
    using System.Text;
      
      public static string Serialize<T>(T obj)
            {
                var serializer = new DataContractJsonSerializer(obj.GetType());
                var ms = new MemoryStream();
                serializer.WriteObject(ms, obj);
                var retVal = Encoding.UTF8.GetString(ms.ToArray());
                return retVal;
            }
    
            public static T Deserialize<T>(string json)
            {
                var obj = Activator.CreateInstance<T>();
                var ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
                var serializer = new DataContractJsonSerializer(obj.GetType());
                obj = (T)serializer.ReadObject(ms);
                ms.Close();
                return obj;
            }


    terça-feira, 26 de janeiro de 2016 18:38
  • Boa tarde,

    Colocar objetos em session nunca é uma boa ideia.

    http://eduardopires.net.br/2015/04/pense-duas-vezes-antes-de-utilizar-sessions/

    Mesmo assim a melhor forma de resolver isso é convertendo o objeto em json e depois voltando ele para o estado original

       
    using System.Runtime.Serialization.Json;
    using System.Text;
      
      public static string Serialize<T>(T obj)
            {
                var serializer = new DataContractJsonSerializer(obj.GetType());
                var ms = new MemoryStream();
                serializer.WriteObject(ms, obj);
                var retVal = Encoding.UTF8.GetString(ms.ToArray());
                return retVal;
            }
    
            public static T Deserialize<T>(string json)
            {
                var obj = Activator.CreateInstance<T>();
                var ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
                var serializer = new DataContractJsonSerializer(obj.GetType());
                obj = (T)serializer.ReadObject(ms);
                ms.Close();
                return obj;
            }


    Olá, então converto para json, coloco na session e depois recupero da session e converto para estado original, isso? Vou estudar este post que mencionou para fazer de outra forma então. Obrigado! 

    Atenciosamente, Ezequiel S. Daniel

    quarta-feira, 27 de janeiro de 2016 00:07