Utilizzando NHibernate per mappare due diversi modelli di dati per modellare un'entità
-
26-09-2019 - |
Domanda
Ho due diversi modelli di dati che mappa per la stessa entità Car. Ho bisogno di creare una seconda entità chiamata ParkedCar, che è identica alla vettura (e quindi eredita da esso) per arrestare lamento NHibernate che due mappature esiste per la stessa entità.
public class Car
{
protected Car()
{
IsParked = false;
}
public virtual int Id { get; set; }
public bool IsParked { get; internal set; }
}
public class ParkedCar : Car
{
public ParkedCar()
{
IsParked = true;
}
//no additional properties to car, merely exists to support mapping and signify the car is parked
}
L'unico problema è che quando vengo a recuperare un auto dal database utilizzando l'API Criteri in questo modo:
SessionProvider.OpenSession.Session.CreateCriteria<Car>()
.Add(Restrictions.Eq("Id", 123))
.List<Car>();
La query porta Enti macchina indietro che sono dal modello di dati ParkedCar. È come se default NHibernate per l'entità specializzata. E le mappature sono con aria di sfida cercando nel posto giusto:
<class name="Car" xmlns="urn:nhibernate-mapping-2.2" table="tblCar">
<class name="ParkedCar" xmlns="urn:nhibernate-mapping-2.2" table="tblParkedCar" >
Come faccio a fermare questo?
Soluzione
Credo che è necessario impostare la proprietà polimorfismo sul mappatura di classe
<class "Car" polymorphism="explicit" ...
Altri suggerimenti
Dal ParkedCar estende auto, una query per auto restituirà sia in auto e oggetti ParkedCar. È possibile limitare il tipo utilizzando HQL utilizzando il speciale classe di resistenza , vale a dire from Car c where c.class = Car
. Non credo che si può fare questo con l'API criteri.
In alternativa si potrebbe filtrare la lista dopo il recupero, se si tratta di una dimensione ragionevole.