2009-12-08 4 views
1

NHibernate 2.1을 사용하고 있습니다. 속성 수식에서 필터를 사용하려고하는데 다음 오류가 발생합니다.NHibernate 속성 수식 필터 오류

'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

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까지 떨어져있을 때이 문서화되지 않은 기능이 나타납니다. –

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 블로그는 원래이 작업을 시도하기 위해 사용한 것입니다. 제가 가진 모든 것은 그의 것입니다. 그는 클래스 바인딩에 필터를 부착하지 않습니다. 그는 제가하려는 것처럼 수식에 필터를 사용하고 있습니다. –

+0

한 가지 차이점은 내가 아는 것은 당신의 속성이 게으르게 표시된다는 것입니다. 반면에 ayende는 그렇지 않습니다. http://stackoverflow.com/questions/1456454/how-to-add-a-hibernate-property-thats-really-a-query – ddango

+0

에 따르면 나는 그것을 사용했지만 여전히 오류가 발생했습니다. –