discriminador nhibernate fluente da tabela relacionada
-
13-11-2019 - |
Pergunta
Eu tenho as 3 tabelas a seguir com valores de exemplo de
Vehicles ( id = 1, type_id = 20 , ... )
Vehicle_Types ( vt_id = 20, class_id = 160, ... )
Vehicle_Classes ( vcls_id = 160, name = "Concrete1" )
eu tenho
public class Concrete1 : Vehicle
{
}
E eu quero que Nibernate instancie um concreto1 ao carregar o veículo nº 1 em
Vehicle /*Concrete1*/ v = session.load<Vehicle>(1);
Como eu poderia fazer isso com mapeamentos automáticos?Desde já, obrigado.
Editar1
Estou começando a pensar que isso é impossível, portanto, qualquer solução alternativa seria apreciada.Qualquer pista para a versão xml (não fluente) também pode ser de grande ajuda.
Solução
OK, primeiro, as más notícias.
- Você não pode ter o discriminador em uma tabela separada, ponto final.Você poderia contornar isso usando uma instrução select com um join como fonte
table
, mas sua entidade seria efetivamente somente leitura.Ou você pode usar uma visualização, que pode funcionar, mas delega mais trabalho ao banco de dados. - Mesmo com mapeamento correto,
session.load<Vehicle>(1)
nunca retornará um tipo derivado (exceto se você desativar o carregamento lento, o que é uma má ideia, ou se a instância concreta já tiver sido carregada como tal na sessão).Você pode obter a instância concreta com esse truque.
Agora, seu modelo de dados parece funcionar melhor com um Vehicle has-a Type
relacionamento do que um <ConcreteVehicle> is-a Vehicle
um.
Isso lhe dá mais flexibilidade (você pode alterar o tipo de veículo, por exemplo) e pode manter características de polimorfismo usando um padrão de estratégia (o tipo de veículo contém o comportamento).
Outras dicas
Acho que esta postagem no blog nhibernate.info faz o que você está procurando.
http://nhibernate.info/blog/2011/02/16/get-load-polymorphism-in-nhibernate-3.html
Se não, pode lhe dar uma ideia.