Eu o utilizei para a leitura de dados do sistema legado sem problemas, segue abaixo um exemplo simplificado:
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.