2009-03-18 12 views
8

Ho una classe mappata a una tabella che utilizza NHibernate. Il problema è che solo alcune delle proprietà sono mappate alle colonne nella tabella. Questo va bene perché le sole colonne che usiamo per la visualizzazione sono mappate, tuttavia mi chiedevo se c'è un modo per interrogare le altre colonne nella tabella che non sono mappate alle proprietà nella mia classe.Interrogazione colonne non mappate in NHibernate

Per esempio abbiamo una tabella con le seguenti colonne:

Customer 
----------- 
CustomerId 
Name 
DateCreated 

e abbiamo un oggetto

public class Customer 
{ 
    public virtual int CustomerId {get;set;} 
    public virtual string name {get;set;} 
} 

e name e customerId sono mappati tuttavia DateCreated è non perché non mostriamo ovunque . Vorremmo richiedere la tabella Customer per i clienti che sono stati creati entro una certa data. C'è un modo per fare questo senza mappando il DateCreated? Inoltre sarebbe preferibile farlo utilizzando l'API dei criteri.

risposta

11

Ayende Rahien pubblicato un articolo che descrive specificando access="noop" nella mappatura per specificare le proprietà di query-only. Vedi NHibernate – query only properties. Non l'ho provato da solo.

+0

Funziona davvero bene e davvero facile da configurare. – Goblin

+0

Non ho potuto ottenere questo lavorare con l'elemento property - c'è un trucco per questo? –

+1

@DaleBurrell Ho appena testato anche questo, non ha funzionato. Secondo i documenti 'noop' ​​non è valido per l'attributo' access' sull'elemento 'property' (vedi [riferimento] (http://nhforge.org/doc/nh/en/#mapping-declaration-property)). –

5

Si sta utilizzando una semplice query SQL fuori dalla domanda? Non sono in grado di testarlo in questo momento, ma immagino che si possa eseguire una query su campi non mappati, purché la query restituisca qualcosa che Hibernate può mappare su un oggetto. (Scusate se questo è stato già esclusa come opzione)

EDIT: Questo sembra funzionare:

ISQLQuery query = session.CreateSQLQuery(
       "select c.* " + 
       "from Customer c " + 
       "where c.CreateDate > :CreateDate"); 

query.SetDateTime("CreateDate", new DateTime(2009, 3, 14)); 
query.AddEntity(typeof(Customer)); 

IList<Customer> results = query.List<Customer>(); 
+0

(i miei nomi delle colonne erano leggermente diversi) –

+0

non è fuori questione, ma mi piacerebbe davvero essere in grado di utilizzare il criterio api, se possibile. Grazie per il post – lomaxx

5

Con HQL/Criteri query, NHibernate può funzionare solo con ciò che è stato mappato (anche se SQL crudo è ancora un'opzione come ha sottolineato Andy White). Se si desidera utilizzare le query di criteri, è necessario mappare la colonna.

Tuttavia, NHibernate non è limitato all'utilizzo di membri accessibili pubblicamente. Quindi, se si desidera mantenere nascosto il campo CreateDate, dichiarare una proprietà privata (forse di sola lettura?). In alternativa, puoi saltare la proprietà e indicare a NHibernate di utilizzare l'accesso a livello di campo impostando access="field" sull'elemento proprietà nella mappatura.

So che volevi fare questo senza mappatura del campo, ma io non credo che sia possibile (senza modificare la fonte NHibernate;). Tuttavia, se stai interrogando il campo, il campo ha una certa rilevanza per il tuo dominio e quindi probabilmente merita di essere mappato al suo interno, e con un membro privato o protetto puoi mantenere nascoste le informazioni.

+0

Ho provato a utilizzare una proprietà privata, ma non è possibile avere una proprietà virtuale privata in C# e nhibernate ha bisogno di una proprietà virtuale :( –

Problemi correlati