NHibernate ApplyFilter не фильтрует - PullRequest
       8

NHibernate ApplyFilter не фильтрует

0 голосов
/ 25 сентября 2019

Я пытаюсь определить и использовать фильтр NHibernate.Я посмотрел на многие другие сообщения на SO.Кроме того, я также использую FluentNhibernate.Когда я сравниваю мои файлы сопоставления hbm, все они выглядят правильно.Мой фильтр называется IsFlaggedForDelete.Вот соответствующие файлы:

filter-def.IsFlaggedForDelete.hbm.xml

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false">
  <filter-def name="IsFlaggedForDelete" condition=":IsFlaggedForDelete.deletedFlag = IsDeleted">
    <filter-param name="deletedFlag" type="Int32" />
  </filter-def>
</hibernate-mapping>

Вот пример файла сопоставления классов:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false">
  <class xmlns="urn:nhibernate-mapping-2.2" name="MyCompany.MyProd.Models.Admin.OneOfMyTables, MyCompany.MyProd.Modules.Service, Version=0.1.2.0, Culture=neutral, PublicKeyToken=c1c38e54126179e5" table="`OneOfMyTables`">
    <id name="Id" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="MyCompany.MyProd.Data.Mapping.Conventions.IdGenerator, MyCompany.MyProd.Core, Version=0.1.2.0, Culture=neutral, PublicKeyToken=c1c38e54126179e5" />
    </id>
    <property name="IsDeleted" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="IsDeleted" />
    </property>
    <property name="Code" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Code" />
    </property>
    <many-to-one cascade="none" class="MyCompany.MyProd.Models.Admin.PartitionAttribute, MyCompany.MyProd.Modules.Bmc.Service, Version=0.1.2.0, Culture=neutral, PublicKeyToken=c1c38e54126179e5" fetch="select" name="PartitionAttribute">
      <column name="PartitionAttributeId" />
    </many-to-one>
    <filter name="IsFlaggedForDelete" condition=":IsFlaggedForDelete.deletedFlag = IsDeleted" />
  </class>
</hibernate-mapping>

Обратите внимание, что они оба добавляются с помощью кода, используя FLUentNHibernate

В моем коде у меня есть следующее:

Session.EnableFilter("IsFlaggedForDelete").SetParameter("deletedFlag", 0);

var gotten = Session.Get<T>(id);

Я пробовал разные методы для настройки, но с учетомсгенерированный xml (который мне кажется правильным) Я не могу понять, почему фильтр не применяется.Я попытался обернуть Фильтр в соглашение (FluentNH), но все безрезультатно.

Любые предложения приветствуются

Спасибо

1 Ответ

0 голосов
/ 25 сентября 2019

Фильтры не работают с методом Get.Для применения фильтров вы должны использовать API запросов (LINQ / QueryOver / hql / Criteria).Что-то вроде:

public TEntity LoadByIdWithFilters<TEntity>(ISession session, object id) where TEntity : class
{
    return session.QueryOver<TEntity>().Where(Restrictions.IdEq(id)).SingleOrDefault<TEntity>();
}

Причина - Get метод не всегда попадает в базу данных.Он может извлекать объект из кэша (сеанса или второго уровня) - и в этом случае действительно сложно применить логику фильтрации.Поэтому, если объект загружается через Get, вам нужно вручную проверить, удален ли он.

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