NHibernate属性公式过滤器错误

时间:2009-12-08 20:07:29

标签: nhibernate nhibernate-mapping

我正在使用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>

我做错了什么?谢谢你的帮助!

2 个答案:

答案 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