Utilizzando NHibernate per mappare due diversi modelli di dati per modellare un'entità

StackOverflow https://stackoverflow.com/questions/2835282

  •  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?

È stato utile?

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.

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