我正在使用NHibernate 2.1。我试图在属性公式中使用过滤器,但我收到以下错误:
过滤器名为'SiteFilter'的过滤器从未用于过滤类和集合。
这是我的映射文件:
<?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>
我做错了什么?谢谢你的帮助!
答案 0 :(得分: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)中将其添加为功能请求。
答案 1 :(得分: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