2009-12-08 5 views
1

J'utilise NHibernate 2.1. J'essaie d'utiliser un filtre dans une formule de propriété, mais j'obtiens l'erreur suivante:Erreur de filtre de formule de propriété NHibernate

Le filtre-def pour le filtre nommé 'SiteFilter' n'a jamais été utilisé pour filtrer des classes ou des collections.

Voici mon fichier de mapping:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataAccess" namespace="DataAccess.Catalog"> 
    <class name="Model.Catalog.Category,Model" table="Catalog.Category"> 

    <id name="ID" column="ID" type="Int32" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 

    <property name="Name" column="Name" type="string" length="50" not-null="true" /> 

    <property name="ProductCount" formula="(SELECT COUNT(*) from Catalog.Product WHERE Product.CategoryID = ID)" lazy="true" /> 
    <property name="SiteProductCount" formula="(SELECT COUNT(*) from Catalog.Product WHERE Product.CategoryID = :SiteFilter.SiteID)" lazy="true" /> 

    <many-to-one name="Image" 
       column="ImageID" 
       not-null="true" 
       class="Model.Catalog.Image,Model" 
       cascade="save-update" /> 

    <bag name="Products" table="Catalog.Product" generic="true" inverse="true"> 
     <key column="CategoryID" /> 
     <one-to-many class="Model.Catalog.Product,Model"/> 
    </bag> 

    </class> 

    <filter-def name="SiteFilter"> 
    <filter-param name="SiteID" type="Int32" /> 
    </filter-def> 
</hibernate-mapping> 

Qu'est-ce que je fais mal? Merci pour toute aide!

Répondre

2

Vérification de la source NHiberante il apparaît que les filtres ne sont pas destinés à être utilisés dans les formules.

La documentation de nhibernate 2.0 ne mentionne pas que vous pouvez utiliser des filtres comme celui-ci.

Les filtres sont destinés à être utilisés pour les entités et applications de collecte, comme ceci:

<class name="MyClass" ...> 
    ... 
    <filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/> 
</class> 

<set ...> 
<filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/> 
</set>** 

L'exception « filtre définition pour le filtre nommé « SiteFilter » n'a jamais été utilisé pour filtrer les classes ni collections. » est lancé une fois que tous les fichiers de configuration ont été lus et qu'une définition de filtre non utilisée est trouvée, qu'elle est utilisée dans une formule comme celle que vous utilisez ici n'est pas reconnue.

Désolé de venir avec de mauvaises nouvelles :) Si vous sentez que c'est une fonctionnalité importante, s'il vous plaît ajouter comme demande de fonctionnalité dans le nhibernate jira (nhjira.koah.net).

+0

hmmm, merci pour le message. Il apparaît cette fonctionnalité non documentée quand loin de 1.x à 2.x. –

0

Je pense que vous devez attacher le filtre dans la classe de liaison.

<class name="Model.Catalog.Category,Model" table="Catalog.Category"> 
    ... 
    <filter name="SiteFilter" condition=":SiteID = CategoryID"/> 
    </class> 

Vous pouvez également activer le filtre d'une session par base de session:

session.EnableFilter("SiteFilter").SetParameter("SiteID", product.Category.ID) 

Informations complémentaires/exemples: https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/filters.html

Turns out, vous pouvez activer le filtre au début de votre application cycle de vie aussi: http://ayende.com/Blog/archive/2006/12/26/LocalizingNHibernateContextualParameters.aspx

+0

Merci pour la réponse. Le blog Ayende est ce que j'ai utilisé à l'origine pour essayer de faire ce travail. Tout ce que j'ai correspond à son - il n'attache pas le filtre dans la classe de liaison - il l'utilise dans la formule comme je suis en train de faire. –

+0

Une différence que je remarque est que vos propriétés sont marquées paresseux, alors que celles d'ayende ne le sont pas. comme sur http://stackoverflow.com/questions/1456454/how-to-add-a-hibernate-property-thats-really-a-query – ddango

+0

Je l'ai enlevé et j'ai quand même eu l'erreur. –

Questions connexes