Многоуровневый NHibernate в объединенном подклассе с фильтром - PullRequest
9 голосов
/ 16 июня 2010

У меня есть настройка класса, которая выглядит примерно так:

public abstract class Parent
{
    public virtual bool IsDeleted { get; set; }
}

public class Child : Parent
{
}

public class Other
{
    public virtual ICollection<Child> Children { get; set; }
}

Дочерний элемент отображается как объединенный подкласс Parent. Childen отображается как сумка «многие к одному». К сумке применен фильтр с именем SoftDeletableFilter. Отображение фильтра выглядит так:

<filter-def name="SoftDeleteableFilter" condition="(IsDeleted = 0 or IsDeleted is null)" />

Эта проблема заключается в том, что при загрузке Other.Children фильтр применяется к дочерней таблице, а не к родительской таблице. Есть ли способ сказать NHibernate, чтобы применить фильтр к родительскому классу?

Edit: Вот родительское отображение:

<class name="Parent">
  <id ..
  <property name="IsDeleted" type="System.Boolean">
    <column name="IsDeleted" />
  </property>
  <joined-subclass name="Child">
    <key>
      <column name="ParentId" />
    </key>
    ...
  </joined-subclass>
</class>

Ответы [ 2 ]

1 голос
/ 29 июля 2011

Наконец-то нашел ответ на это. Возможно, это не самый дружественный к производительности подход, но вы можете переписать условие фильтра как подзапрос:

ParentId in (Select p.ParentId from Parent p where p.IsDeleted = false)

Спасибо CSharper за в группе пользователей за предложение

0 голосов
/ 06 июля 2011

вам нужно добавить фильтр в родительский класс:

<class name="Parent">
  <id ..
  <property name="IsDeleted" type="System.Boolean">
    <column name="IsDeleted" />
  </property>
  <joined-subclass name="Child">
    <key>
      <column name="ParentId" />
    </key>
    **<filter-def name="SoftDeleteableFilter" condition="(IsDeleted = 0 or IsDeleted is null)" />**
  </joined-subclass>
  **<filter-def name="SoftDeleteableFilter" condition="(IsDeleted = 0 or IsDeleted is null)" />**
</class>
...