2009-04-20 6 views
5

Ho una classe, Ordine, che insisto a un database utilizzando NHibernate. C'è una cartella più in basso nell'applicazione web che contiene un oggetto che eredita dall'Ordine, per i nostri scopi, possiamo chiamarlo CustomOrder. Uso CustomOrder per posizionare alcune proprietà sull'oggetto Order per scopi di interfaccia utente. Le proprietà non devono essere effettivamente salvate nel database.NHibernate Inherited classe, ma non c'è bisogno di persistere

quando passo la classe CustomOrder al mio metodo generico salvo che vuole solo in un oggetto Ordine, NHibernate si lamenta:

Unknown classe entità: CustomOrder.

Non ho bisogno di persistere i campi personalizzati al database, ma mi piacerebbe mantenere questa struttura di ereditarietà. Sto pensando nei termini sbagliati o facendo qualcosa che non dovrei fare?

Salva codice

public object Save(Order obj, object userID) { 
     Order o = (Order)obj; 
     ISession session = NHibernateHelper.GetCurrentSession(); 
     ITransaction tx = session.BeginTransaction(); 

     session.Save(o); 

Dopo il caso nella prima riga del metodo, .NET identifica ancora come OrdineCliente.

risposta

2
  1. Non è possibile modificare il tipo di un'istanza in .NET. Non c'è il casting o qualsiasi altra cosa che lo renda possibile.
  2. Quando si carica l'istanza dal DB, NHibernate vuole creare lo stesso tipo è stato memorizzato. Ecco perché vuole una mappatura per CustomOrder.

Come mai lo si implementa: è necessario creare una nuova istanza di ordine.

// get the CustomOrder from somewhere 
CustomOrder customOrder; 
// create an instance of Order and store it. 
session.Save(customOrder.GetOrder()); 


class CustomOrder 
{ 

    // just one of many ways: a method on the CustomOrder to create 
    // instance of Order 
    public GetOrder() 
    { 
     return new Order() 
     { 
      property1 = this.property1, 
      property2 = this.property2, 
      property3 = this.property3 
     } 
    } 
} 

È possibile utilizzare Reflection per eseguire automaticamente questa operazione. o dare un'occhiata a MemberwiseClone().

+0

+1 questo è esattamente quello che stavo per suggerire (e l'unico modo per farlo). –

0

E 'stato un po', ma credo che si dovrebbe essere in grado di specificare che la classe derivata deve essere mantenuta come un oggetto della classe base nel file di mapping Hibernate.

+0

C'è una soluzione a dover fornire un discriminatore per una sottoclasse? – Josh