2009-05-12 14 views
5

Ho una tabella denominata "Orderrow". Orderrow ha una chiave primaria composta (CPK) con le seguenti colonne: OrderId, ProductId, RowNumberNHibernate mappatura chiavi primarie multiple

OrderId e ProductId sono anche chiavi esterne che fanno riferimento alle tabelle Ordine e Prodotto. Il RowNumber viene generato nell'app.

Mi chiedevo come questo è mappato in NHibernate perché posso solo impostare 1 elemento id e 1 sottoelemento generatore.

risposta

6

C'è una proprietà 'composite-id' che puoi usare nel tuo mapping di classe invece della proprietà 'id'. Tuttavia, dovresti sapere che il team di nHibernate scoraggia fortemente l'uso di esso. Sembra che tu abbia a che fare con un database precedente, in cui non hai alcun controllo sullo schema. Quindi, l''ID composito' è specifico per la tua situazione.

Scopri i documenti NH per maggiori informazioni: http://nhibernate.info/doc/nh/en/index.html

+0

ho letto che anche nell'API rif NHibernate. Ma non ho un database "legacy", solo un database per scopi di ricerca, quindi posso facilmente modificare la tabella degli ordini qui. Quindi qual è l'opzione migliore preferita nella progettazione di una tabella? Devo creare 1 chiave primaria sulla tabella Orderrow che è univoca per riga? –

+0

Sì. È preferibile un'unica colonna univoca per primaria. – NathanD

0

Personalmente non mi piace avere le chiavi primarie composte nei miei schemi di tabella del database, più che di solito sono 'hard' di gestire da qualsiasi mapping ORM ho provato. Se devo dare un'identità univoca a una riga in una tabella (specialmente se rappresenta un oggetto business), preferisco usare un ID surrogato a valore singolo - un GUID o un intero - se uno qualsiasi dei campi nella tabella non è adatto L'utilizzo di un ID composito è sempre problematico quando si scrivono query di interrogazioni e join, quindi la mia strategia abituale è utilizzare un ID surrogato (che non ha significato per l'oggetto business ma per identificare l'oggetto stesso) e posizionare un vincolo univoco nei campi di il CPK precedente.

9

Ecco un esempio utilizzando la proprietà composite-id in un file di mapping NHibernate:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Model"> 

    <class name="Program" table="program"> 
    <composite-id> 
     <key-property name="Id" column="id"></key-property> 
     <key-property name="Prog" column="prog"></key-property> 
     <key-property name="Site" column="site"></key-property> 
    </composite-id> 
    <property name="ActiveDate" column="active_date"/> 
    <property name="Year" column="year"/> 
    </class> 

</hibernate-mapping> 
Problemi correlati