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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top