Как использовать проекции с <dynamic-component> в NHibernate? - PullRequest
0 голосов
/ 28 сентября 2011

Я использую элементы <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 Ответ

1 голос
/ 28 сентября 2011

Я не думаю, что вы хотите использовать проекцию там. Попробуй поменять

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

для

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...