Mapeamento Entre tres tabelas

50 views
Skip to first unread message

Luciano Lima

unread,
Jul 20, 2015, 8:22:05 PM7/20/15
to nhiber...@googlegroups.com
Pessoal...tenho tentado achar aqui no forum mas sem sucesso uma duvida para um mapeamento entre duas tabelas pai e uma filho..da seguinte maneira..

Tabela com NF-e -> ChaveAcesso
Tabela com CT-e -> ChaveAcesso

preciso mapear essas duas tabelas numa terceira que iria guardar informações sobre pendencia...e nessa tabela tenho..TipoObjeto = CTe ou NFe, mais a ChaveAcesso q pode ser tanto de uma NF-e ou de um CT-e...alguem poderia ajudar?

Vlw demais

Seguem a classe de pendencia...nesse caso a tabela dela pode receber uma pendencia q tem referencia ou na tabela de NF-e ou de CT-e

    public class Pendencia
    {
        /// <summary>
        /// 
        /// </summary>
        public virtual int CodigoPendencia { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public virtual string ChaveAcesso { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public virtual TipoObjetoPendencia TipoObjetoPendencia { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public virtual string Motivo { get; set; }
}

Adrianno

unread,
Jul 21, 2015, 9:41:56 AM7/21/15
to nhiber...@googlegroups.com
Utilize o mapeamento com a tag </any>, ou o método ReferencesAny() no fluent, veja o post abaixo:

Silvagpe

unread,
Jul 22, 2015, 10:05:19 AM7/22/15
to NHibernate-Br
Bom Dia Luciano,

Vou te dar uma ideia, sei que não é bem isso que você está procurando, mas pode simplificar as coisas.

Na classe Pendencia você cria o TipoObjetoPendencia como um enumerado e duas propriedade para as classes CTe e NFe, dessa forma vc faz duas referencias simples e para consultar o valor você verificar o enumerado antes.  Talvez não tenha ficado muito claro...

Enum TipoObjetoPendencia
{
  NFE,
  CTe
}


Exemplo:

public enum TipoEntidade : short
        {
            PessoaFisica = 1,         
            PessoaJuridica = 2
        }

public class PES_Entidade :IEntidade
    {
        public virtual int Id_Entidade { get; set; }

        public virtual Enumerados.TipoEntidade Tipo_Entidade { get; set; }

        public virtual PES_Pessoa_Fisica PessoaFisica { get; set; }

        public virtual PES_Pessoa_Juridica PessoaJuridica { get; set; }



public class PES_EntidadeMap : ClassMap<PES_Entidade>
    {
        public PES_EntidadeMap()
        {
            Table("entidade");
            Id(x => x.Id_Entidade, "id_entidade").GeneratedBy.Assigned();
            
            Map(x => x.Tipo_Entidade, "tipo_entidade").Not.Nullable();
            References(x => x.PessoaFisica, "id_entidade").Nullable();
            References(x => x.PessoaJuridica, "id_entidade").Nullable();


Em uso

            switch (this.Entidade.Tipo_Entidade)
            {
                case Enumerados.TipoEntidade.PessoaFisica:
                    txtCPF_CNPJ.Text = this.Entidade.PessoaFisica.Cpf;
                    txtRG_IE.Text = this.Entidade.PessoaFisica.Rg;
                    break;
                case Enumerados.TipoEntidade.PessoaJuridica:
                    txtCPF_CNPJ.Text = this.Entidade.PessoaJuridica.Cnpj;
                    txtRG_IE.Text = this.Entidade.PessoaJuridica.Ie;
                    break;
            }


Espero ter ajudado.

At.
Rafael

Husseyn Hussa

unread,
Jul 22, 2015, 10:12:36 AM7/22/15
to Nhibernate Br
NUNCA use a tag ANY.

NUNCA.

Se você precisa encaixar 2 objetos totalmente diferentes em um mesmo lugar, você fez tudo errado.

Reveja se você pode criar uma estrutura de herança entre esses 2 objetos ou usar HiLo ao invés de autonumeração.

Abs

--
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.

Adrianno

unread,
Jul 22, 2015, 2:26:42 PM7/22/15
to NHibernate-Br
O relacionamento polimórfico é suportado no NHibernate, mas é meio chato para fazer. 
Eu o utilizei para a leitura de dados do sistema legado sem problemas, segue abaixo um exemplo simplificado:

Classes de entidade:

public interface IParceiro
{
    long Id { get; set; }
}

public class Fornecedor : IParceiro
{
    public virtual long Id{get; set;}
    [... mais atributos ...]
}

public class Transportadora : IParceiro
{
    public virtual long Id{get; set;}
    [... mais atributos ...]
}

//Não irei demonstrar o mapeamento para o enum pois o código irá ficar muito longo
public enum TipoParceiro {Fornecedor = 0, Transportadora = 1} 

public class Titulo 
{
    public virtual long Numero {get; set;}
    public virtual TipoParceiro TipoParceiro {get; set;}
    public virtual IParceiro Parceiro {get; set;}
    [... mais atributos ...]
}

O Mapeamento:

public class FornecedorMap : ClassMap<Fornecedor>
{
    public FornecedorMap()
    {
        Table("Tab1");
        Id(x=>x.Id)
            .Column("codigoforne")
            .GeneratedBy.Sequence("seq1");
    }
}

public class TransportadoraMap : ClassMap<Transportadora>
{
    public FornecedorMap()
    {
        Table("Tab2");
        Id(x=>x.Id)
            .Column("codigotrans")
            .GeneratedBy.Sequence("seq2");
    }
}

public class TituloMap : ClassMap<Titulo>
    public TituloMap()
    {
        Table("Tab3");
        Id(x=>x.Numero)
            .Column("numerotitulo")
            .GeneratedBy.Sequence("seq3");
        Map(x=>x.TipoParceiro)
            .Column("tipoparceiro")
            .CustomType<TipoParceiroMap>();
        ReferencesAny(x => x.Parceiro)
            .IdentityType<Int64>()
            .EntityTypeColumn("tipoparceiro")
            .EntityIdentifierColumn("codigoparceiro") //nome da coluna na tabela dos títulos 
            .AddMetaValue<Fornecedor>("0")            //resumo : se tipoparceiro = 0 : relacionamento com a tabela de fornecedor
            .AddMetaValue<Transportadora>("1");       //         se tipoparceiro = 1 : relacionamento com a tabela de transp.
    }
}


Para utilizar:

Titulo tit = session.Get<Titulo>(1);

if (tit.Parceiro is Fornecedor) then
{
    Fornecedor forne = (Fornecedor) tit.Parceiro;
    [... realiza ações com fornecedor ...]
}
else
{
    Transportadora transp = (Transportadora) tit.Parceiro;
    [... realiza ações com transportadora ...]
}


Lembrando que esse código eu só usei para leitura da base de dados, nunca tentei gravar nada, mas acredito que não teria problema.
Reply all
Reply to author
Forward
0 new messages