2009-12-08 110 views
1

我正在使用NHibernate 2.1。我試圖在屬性公式中使用過濾器,但出現以下錯誤:NHibernate屬性公式篩選器錯誤

過濾器名稱爲「SiteFilter」的filter-def從未用於過濾類或集合。

這裏是我的映射文件:

<?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> 

我在做什麼錯?謝謝你的幫助!

回答

2

檢查NHiberante源代碼,看起來過濾器不打算在公式中使用。

nhibernate 2.0文檔沒有提到你可以使用這樣的過濾器。

過濾器旨在用於實體和集合映射,像這樣:

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

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

例外「過濾器高清名爲‘SiteFilter’過濾器從未用來過濾類,也不收藏。」在所有配置文件被讀取並且發現未被使用的過濾器定義之後被拋出,它在正如在這裏使用的公式中被使用的過濾器定義不被識別。

對不起,帶來壞消息:)如果您認爲這是一項重要功能,請將其作爲功能請求添加到nhibernate jira(nhjira.koah.net)中。

+0

嗯,謝謝你的留言。當從1.x變爲2.x時,它顯示出這種未公開的特徵。 – 2009-12-16 21:38:04

0

我認爲你需要在類綁定中附加過濾器。

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

您還可以啓用通過基於會話的會話過濾器:

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

附加信息/例子:https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/filters.html

事實證明,你可以在你的應用程序開始時啓用過濾器生命週期以及:http://ayende.com/Blog/archive/2006/12/26/LocalizingNHibernateContextualParameters.aspx

+0

感謝您的回覆。 Ayende博客是我最初嘗試做這項工作的。我所有的東西都與他相匹配 - 他沒有在類綁定中附加過濾器 - 他正在使用它,就像我正在嘗試的那樣。 – 2009-12-11 02:35:57

+0

我注意到的一個區別是你的屬性被標記爲懶惰,而ayende則不是。按照http://stackoverflow.com/questions/1456454/how-to-add-a-hibernate-property-thats-really-a-query – ddango 2009-12-11 06:13:09

+0

我把它關閉,仍然有錯誤。 – 2009-12-11 14:25:13