2011-09-27 5 views
0

나는 필드를 데이터베이스에 추가하여 제품 기능을 확장 할 수있는 기능을 최종 사용자에게 제공하기 위해 <dynamic-component> 요소를 사용하고 있습니다.NHibernate에서 <dynamic-component>와 함께 어떻게 투영법을 사용합니까?

우리의 매핑의 단순화 된 버전은 다음과 같습니다

public class Asset 
{ 
    public virtual long AssetNumber{get; set;} 
    public Classification Classification {get; set;} 
    public virtual IDictionary UserDefinedFields {get; set;} 
} 

public class Classification 
{ 
    public virtual string Name {get; set;} 
    public virtual ICollection<Asset> Assets {get; private set;} 
    public virtual IDictionary UserDefinedFields {get; set;} 
} 

내가 실행 해요 문제는 이제 사용자가 우리의 필터링 도구를 사용할 것입니다 :

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Caselle.Am0.DTO" assembly="Caselle.Am0.DTO" schema="dbo"> 
    <class name="Asset" table="[tblAsset]" lazy="true"> 
    <id name="ID" column="ID" type="Int32"> 
     <generator class="native" /> 
    </id> 
    <property name="AssetNumber" column="[AssetNumber]" type="long" not-null="true" /> 
    <dynamic-component insert="true" update="true" name="UserDefinedFields" /> 
    <many-to-one name="Classification" column="tblClassificationID" class="Lib.DTO.Classification, Lib.DTO" cascade="none" /> 
</class> 

<class name="Classification" table="[tblClassification]" lazy="true"> 
    <id name="ID" column="ID" type="Int32"> 
    <generator class="native" /> 
    </id> 
    <property name="Name" column="[Classification]" type="String" not-null="true" length="20" /> 
    <dynamic-component insert="true" update="true" name="UserDefinedFields" /> 
    <set name="Assets" table="tblAsset" lazy="true" cascade="all-delete-orphan" inverse="true"> 
    <key column="tblClassificationID"/> 
    <one-to-many class="Lib.DTO.Asset, Lib.DTO"/> 
</hibernate-mapping> 

클래스

이 같을 다음 쿼리를 실행할 때 QueryException ('X'속성을 확인할 수 없음)이 표시됩니다.

var query = session.CreateCriteria<Asset>() 
      .Create Alias("c", "Classification") 
      .Add(Restrictions.Eq(Projections.Property("c.X"), "value") 
      .ToList<Asset>(); 

이런 종류의 영사를 할 수 있습니까? 내가이 쿼리를 작성할 수있는 방법은 무엇입니까? (필자는 Criteria API를 정말 좋아합니다. 즉,이 쿼리를 즉석에서 생성하고 있기 때문에, 다른 방법으로 작업해야한다면 ...)?

답변

1

나는 거기에 투영법을 사용하고 싶지 않습니다.

.Add(Restrictions.Eq("c.UserDefinedFields.X", "value")

+0

돌기가 잘 작동 밝혀 위해

.Add(Restrictions.Eq(Projections.Property("c.X"), "value")

을 교환하려고, 난 그냥 대신 "c.X"의 "c.UserDefinedFields.X"를 사용합니다. 감사! – Neil

관련 문제