0

「写真」オブジェクト用に次のマッピングファイルがあります(簡潔にするために編集)。

<hibernate-mapping ... default-access="property" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Photo" table="Photos">
    <id name="PhotoId" unsaved-value="0">
        <column  name="PhotoId" />
        <generator class="native" />
    </id>
    ...
    <bag name="Comments" table="Comments" lazy="false" order-by="DateTimePosted desc" cascade="all-delete-orphan" inverse="true">
        <key column="PhotoId" />
        <one-to-many class="Comment" />
    </bag>
</class>

'Comments'バッグに対してWhere句を適用して、'Approved'プロパティ=trueのコメントのみを取得したいと思います。ただし、これを設定すると、削除されたPhotoオブジェクトがwhere句の条件を満たさなかったため、削除された未承認のコメントがカスケードされない(孤立したコメントレコードが残る)という問題シナリオに遭遇しました。本質的には、カスケード削除を除いてwhere句を順守する必要がありました。その場合、写真が削除されたときに、写真に関連付けられたコメントを常に削除する必要がありました。

これが私のコメントマッピングファイルの編集されたコピーです:

<hibernate-mapping ... default-access="property" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Comment" table="Comments">
    <id name="CommentId" unsaved-value="0">
        <column name="CommentId"></column>
        <generator class="native" />
    </id>
    <property name="DateTimePosted" not-null="true" />
    ...
    <property name="Approved" not-null="true" />
    <many-to-one name="Photo">
        <column name="PhotoId" />
    </many-to-one>
</class>

どうすればこれを回避できますか?

4

1 に答える 1

1

NHibernateは、「カスケード削除を除いてwhere句を順守する必要がある」と推測できないため、代わりにフィルターを使用してコレクションアイテムを取得する必要があります。

別の方法は、LINQ-to-objectsプロジェクションを使用することです。

public virtual IEnumerable<Comment> ApprovedComments
{
    get { return Comments.Where(c => c.Approved); }
}
于 2011-01-21T19:12:42.453 に答える