如何在NHibernate中使用<dynamic-component>投影?</dynamic-component>

时间:2011-09-27 22:00:34

标签: nhibernate

我正在使用<dynamic-component>元素为最终用户提供通过向数据库添加字段来扩展产品功能的能力。

我们的映射的简化版本是:

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

这些类看起来像这样:

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;}
}

我遇到的问题是,现在用户想在他们的自定义字段上使用我们的过滤工具,当我运行以下查询时,我得到一个QueryException(无法解析属性'X'):

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

可以做这种投影吗?我怎么可能写这个查询(我真的很喜欢Criteria API,因为我正在动态生成这个查询,但是如果我必须以其他方式工作......)?

1 个答案:

答案 0 :(得分:1)

我认为你不想在那里使用投影。尝试交换

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

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