9

次のようなクラス設定があります。

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

public class Child : Parent
{
}

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

子は、親の結合サブクラスとしてマップされます。チャイルデンは多対多のバッグとしてマッピングされています。バッグには、SoftDeletableFilterという名前のフィルターが適用されています。フィルタマッピングは次のようになります。

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

その問題は、Other.Childrenがロードされると、フィルターが親テーブルではなく子テーブルに適用されることです。NHibernateに親クラスにフィルターを適用するように指示する方法はありますか?

編集:これが親マッピングです:

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

2 に答える 2

1

ついにこれに対する答えを見つけました。おそらく最もパフォーマンスに優しいアプローチではありませんが、フィルター条件をサブクエリとして書き直すことができます。

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

提案をしてくれたユーザーグループのCSharperに感謝します

于 2011-07-29T15:29:19.640 に答える
0

親クラスにフィルターを追加する必要があります。

<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>
于 2011-07-06T12:50:21.483 に答える