NHibernate'哪里'条款导致级联删除问题

时间:2011-01-21 17:52:11

标签: asp.net nhibernate nhibernate-mapping cascading-deletes

我有“Photo”对象的以下映射文件(为简洁起见编辑):

<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子句加入EXCEPT以进行级联删除,在这种情况下,我总是希望在删除照片时删除与照片相关的任何注释。

以下是我的评论映射文件的编辑副本:

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

我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

由于NHibernate无法猜测你“想要将where子句加入EXCEPT以进行级联删除”,所以你需要使用filters来获取集合项。< / p>

另一种方法是使用LINQ到对象投影:

public virtual IEnumerable<Comment> ApprovedComments
{
    get { return Comments.Where(c => c.Approved); }
}