2009-03-18 12 views
8

J'ai une classe mappée à une table à l'aide de NHibernate. Le problème est que seules certaines propriétés sont mappées aux colonnes de la table. C'est très bien parce que les seules colonnes que nous utilisons pour l'affichage sont mappées, mais je me demandais s'il y avait un moyen d'interroger les autres colonnes de la table qui ne sont pas mappées aux propriétés de ma classe.Interrogation de colonnes non mappées dans NHibernate

Par exemple, nous avons une table avec les colonnes suivantes:

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

et nous avons un objet

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

et name et customerId sont mises en correspondance cependant DateCreated est pas parce que nous affichons jamais nulle part . Nous souhaitons interroger le tableau Customer pour les clients créés à une certaine date. Y at-il un moyen de le faire sans mappant le DateCreated? Aussi, il serait préférable de le faire en utilisant l'API de critères.

Répondre

11

Ayende Rahien a publié un article qui décrit la spécification access="noop" dans le mappage pour spécifier les propriétés de requête uniquement. Voir NHibernate – query only properties. Je n'ai pas essayé cela moi-même.

+0

Cela fonctionne vraiment très bien et vraiment facile à configurer – Goblin

+0

Je n'ai pas pu l'obtenir –

+1

@DaleBurrell Je l'ai aussi testé, ça n'a pas fonctionné, d'après les docs 'noop' ​​n'est pas valide pour l'attribut' access' de l'élément 'property' (voir [référence] (http://nhforge.org/doc/nh/fr/#mapping-declaration-property)). –

5

L'utilisation d'une requête SQL normale est-elle hors de question? Je ne suis pas en mesure de le tester maintenant, mais j'imagine que vous pouvez interroger sur des champs non mappés, tant que votre requête renvoie quelque chose que Hibernate peut mapper à un objet. (Désolé si cela a déjà été exclu en option)

EDIT: Cela semble fonctionner:

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

(mes noms de colonne étaient légèrement différents) –

+0

ce n'est pas hors de question mais j'aimerais vraiment pouvoir utiliser les critères api si possible. Merci pour l'article – lomaxx

5

Avec des requêtes HQL/critères, NHibernate ne peut fonctionner avec ce qui a été cartographiée (bien que SQL brut est encore une option comme l'a souligné Andy White). Si vous souhaitez utiliser des requêtes de critères, vous devez mapper la colonne. Cependant, NHibernate n'est pas limité à l'utilisation de membres accessibles au public. Donc, si vous voulez continuer à masquer le champ CreateDate, déclarez une propriété privée (peut-être en lecture seule?). Vous pouvez également ignorer la propriété et indiquer à NHibernate d'utiliser l'accès au niveau du champ en définissant access="field" sur l'élément de propriété dans le mappage.

Je sais que vous vouliez faire cela sans cartographier le champ, mais je ne pense pas que ce soit possible (sans modifier la source de NHibernate;). Cependant, si vous interrogez le champ, le champ a une certaine pertinence pour votre domaine et mérite donc probablement d'être mappé sur celui-ci. Avec un membre privé ou protégé, vous pouvez conserver les informations en place.

+0

J'ai essayé d'utiliser une propriété privée, mais vous ne pouvez pas avoir une propriété virtuelle privée en C# et nhibernate a besoin d'une propriété virtuelle :( –

Questions connexes