Domanda

Ho il seguente 3 tabella con valori di esempio di

Vehicles ( id = 1, type_id = 20 , ... )
Vehicle_Types ( vt_id = 20, class_id = 160, ... )
Vehicle_Classes ( vcls_id = 160, name = "Concrete1" )
.

Ho

public class Concrete1 : Vehicle
{

}
.

e voglio che nibernate istanziare un calcestruzzo1 quando caricando il veicolo # 1 in

Vehicle /*Concrete1*/ v = session.load<Vehicle>(1);

Come potrei farlo con gli automi?Grazie in anticipo.

Edit1

Sto iniziando a pensare che questo sia impossibile, quindi qualsiasi soluzione alternativa sarebbe apprezzata.Qualsiasi indizio per la versione XML (non fluente) potrebbe essere di grande aiuto.

È stato utile?

Soluzione

OK, prima, le cattive notizie.

    .
  • Non è possibile avere il discriminatore in una tabella separata, periodo. Potresti hackerare questo utilizzando una dichiarazione di selezione con un join come sorgente table, ma la tua entità sarebbe efficacemente lettura. Oppure puoi usare una vista, che potrebbe funzionare, ma delega più lavoro sul DB.
  • Anche con la mappatura corretta, session.load<Vehicle>(1) non restituirà mai un tipo derivato (tranne se si disabilita il caricamento pigro, che è una cattiva idea, o se l'istanza concreta è stata già caricata in quanto tale nella sessione). Puoi ottenere l'istanza concreta con Questo hack .

    Ora, il tuo modello di dati sembra comporterebbe meglio con una relazione Vehicle has-a Type di un <ConcreteVehicle> is-a Vehicle.

    Questo ti dà più flessibilità (è possibile modificare il tipo di veicolo, ad esempio), e puoi mantenere le funzionalità di polimorfismo utilizzando un modello di strategia (il tipo di veicolo contiene il comportamento).

Altri suggerimenti

Penso che questo post sul blog nibernate.infoda ciò che stai cercando di fare.

http://NHibernate.info / blog / 2011/02/16 / Get-load-polymorphism-in-nhibernate-3.html

Se non potrebbe darti un'idea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top