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를 정말 좋아합니다. 즉,이 쿼리를 즉석에서 생성하고 있기 때문에, 다른 방법으로 작업해야한다면 ...)?
돌기가 잘 작동 밝혀 위해
.Add(Restrictions.Eq(Projections.Property("c.X"), "value")
을 교환하려고, 난 그냥 대신 "c.X"의 "c.UserDefinedFields.X"를 사용합니다. 감사! – Neil