Query Linq - Herança

39 views
Skip to first unread message

Théo Porto

unread,
Oct 16, 2014, 2:57:28 PM10/16/14
to nhiber...@googlegroups.com
Olá pessoal, blz?

Estou com um cenário no NHibernate que não consigo resolver. Mapeei duas classes (Colaborador e PrestadorServico) abstraindo o conceito delas para uma (Papel). Porém ao fazer uma consulta utilizando Linq não consigo fazer Cast nelas. Alguma sugestão de configuração? Segue cenário:

public abstract class Papel
{

}

public class Colaborador : Papel
{
   public virtual Empresa Empresa { get; set; }
}

public class PrestadorServico : Papel
{
   public virtual Empresa Empresa { get; set; }
}

//query utilizada

var controleAcesso = controleAcesso.Where(ca => (ca.Papel is Colaborador && ((Colaborador)ca.Papel).Empresa.Codigo == empresa)
                                                         || (ca.Papel is PrestadorServico && ((PrestadorServico)ca.Papel).Empresa.Codigo == empresa)
                                                     );

Ao processar esta query ele dá erro dizendo que não consegue fazer join em Empresa.

Se puderem me ajudar agradeço.

Att,

Théo Porto

Silvagpe

unread,
Oct 17, 2014, 8:01:57 AM10/17/14
to nhiber...@googlegroups.com
Bom Dia Théo,

Pode postar o mapeamento também?

At.
Rafael

Théo Porto

unread,
Oct 17, 2014, 8:31:22 AM10/17/14
to nhiber...@googlegroups.com
Olá Rafael! Segue o mapeamento das classes.


public class PapelMap : ClassMap<Papel>
    {
        public PapelMap()
        {
            Table("PAPEL");

            Id(p => p.Codigo, "CD_PAPEL");
            References(p => p.PessoaFisica, "CD_PESSOA_FISICA");
            References(p => p.Cargo, "CD_CARGO");
            References(p => p.ModeloCracha, "CD_MODELO");
            Map(p => p.SenhaLeitora, "TX_SENHA");
            Map(p => p.PessoaJuridica, "BL_JURIDICO").Not.Nullable();
            Map(p => p.AntiPassBack, "BL_PASSBACK").Not.Nullable();
            Map(p => p.SobAnalise, "BL_SOB_ANALISE").Not.Nullable();
            Map(p => p.Supervisor, "BL_SUPERVISOR").Not.Nullable();
            Map(p => p.Supervisionado, "BL_SUPERVISIONADO").Not.Nullable();

            HasMany(p => p.ASOs).KeyColumn("CD_PAPEL").Inverse();            

            HasMany(p => p.PapelLogs)
              .KeyColumn("CD_PAPEL");

            HasMany(p => p.ExcecaoAcesso)
              .KeyColumn("CD_PAPEL");
        }

    }

public class ColaboradorMap : SubclassMap<Colaborador>
    {
        public ColaboradorMap()
        {
            Table("COLABORADOR");

            KeyColumn("CD_PAPEL");

            References(b => b.Empresa, "CD_EMPRESA").Not.Nullable();
            
            Map(b => b.PIS, "NU_PIS");
            Map(b => b.HoristaMensalista, "TX_MENSALISTA");
            Map(b => b.DataAdmissao, "DT_ADMISSAO");

            Map(b => b.Salario, "NU_SALARIO");
            Map(b => b.Observacao, "TX_OBSERVACAO");

            Map(b => b.ConselhoProfissional, "TX_CONSELHOPROF");
            Map(b => b.RegistroProfissional, "TX_REGISTROPROF");            
        }

public class PrestadorServicoMap : SubclassMap<PrestadorServico>
    {
        public PrestadorServicoMap()
        {
            Table("PRESTADOR");

            KeyColumn("CD_PAPEL");

            References(p => p.Solicitante, "CD_SOLICITANTE").Not.Nullable();
            References(p => p.Empresa, "CD_EMPRESA").Nullable();
            References(p => p.Fornecedor, "CD_FORNECEDOR").Nullable();

            Map(p => p.DataAdmissao, "DT_ADMISSAO").Nullable();
            Map(p => p.DataValidade, "DT_VALIDADE").Not.Nullable();
            Map(p => p.TipoPrestador, "TX_PRESTADOR").Nullable().Length(50);
            Map(p => p.Observacao, "TX_OBSERVACAO").Nullable().Length(250);

        }
    }


----
Considerações,

Théo Porto
Phone: (27) 99795 9272

--
Você recebeu essa mensagem porque está inscrito no grupo "NHibernate-Br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nhibernate-b...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para nhiber...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/nhibernate-br.
Para mais opções, acesse https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages