2010-06-03 4 views
8

Sembra che NHibernate abbia bisogno di avere un tag id specificato come parte della mappatura. Questo presenta un problema per le visualizzazioni come la maggior parte delle volte (nella mia esperienza) una vista non avrà un ID. Ho mappato le viste in precedenza in nhibernate, ma il modo in cui l'ho fatto sembrava essere disordinato per me.Strategie per mappare le viste in NHibernate

Ecco un inventato esempio di come lo sto facendo attualmente.

Mapping

<class name="ProductView" table="viewProduct" mutable="false" > 
    <id name="Id" type="Guid" > 
     <generator class="guid.comb" /> 
    </id> 
    <property name="Name" /> 
<!-- more properties --> 
    </class> 

Visualizza SQL

Select NewID() as Id, ProductName as Name, --More columns 
From Product 

Classe

public class ProductView 
{ 
    public virtual Id {get; set;} 
    public virtual Name {get; set;} 
} 

Non ho bisogno di un ID per la p roduct o nel caso di alcuni punti di vista, potrei non avere un ID per la vista, a seconda se ho il controllo sulla vista

Esiste un modo migliore per mappare le viste sugli oggetti in nibernetico?

Modifica
risposta So Far

Mapping

<class name="ProductView" table="viewProduct" mutable="false" > 
    <id name="Id" type="Guid" /> 
    <property name="Name" /> 
    <!-- more properties --> 
    </class> 

Classe

public class ProductView 
    { 
     public virtual Name {get; set;} 
     //more properties 
    } 

Visualizza SQL
Ho ancora bisogno di NewID()?

Select NewID() as Id, ProductName as Name, --More columns 
From Product 

risposta

5

Si può rendere solo un po 'più pulita, non mappare l'ID per una proprietà e omettendo il generatore:

<id column="Id" type="guid"/> 

In questo modo, si mantiene il problema nel livello dati, senza perdite dettaglio implementazione al tuo dominio.

+0

significa che posso rimuovere NewID() da TSQL Select poiché è lì solo per soddisfare la necessità di nhibernate su un ID –

+2

No, significa che la classe non ha bisogno di una proprietà Id. –

+0

Ben ha ragione. NHibernate non ha bisogno che l'ID sia mappato su una proprietà, ma ha sempre bisogno di un modo per identificare le istanze persistenti. –

2

quanto ne so, NHibernate richiederanno sia un id o una definizione composite-id poiché è il meccanismo che identifica in modo univoco un determinato record. Se non c'è nessuna combinazione di colonne che fornisce una chiave per ogni riga nella vista, penso che tu sia bloccato con soluzioni alternative agli hacky.

+2

Mi piacerebbe che quando si contrassegna una classe come 'mutable = false' che la necessità esplicita di un ID scompaia. non sono sicuro che sia pratico, ma renderebbe più facile gestire scenari come questo. –