【问题标题】:NHibernate 'Where' Clause causing problems on cascading deletesNHibernate 'Where' 子句导致级联删除问题
【发布时间】:2011-01-21 17:52:11
【问题描述】:

我有以下“照片”对象的映射文件(为简洁而编辑):

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

我想对“评论”包应用 Where 子句,以仅检索“已批准”属性 = true 的评论。然而,当我把它放在适当的位置时,我遇到了一个问题场景,其中删除的照片对象没有级联删除的未批准的 cmets(并且留下孤立的评论记录),因为它不符合 where 子句的条件!本质上,我希望遵守 where 子句,但级联删除除外,在这种情况下,我总是希望在删除照片时删除与照片关联的任何 cmets。

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

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

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    由于 NHibernate 无法猜到您“希望除了级联删除之外遵守 where 子句”,您需要使用 filters 来获取集合项。

    另一种方法是使用 LINQ-to-objects 投影:

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

    【讨论】:

    • 非常感谢迭戈。我现在已经采用了 LINQ-to-objects 方法,这似乎可以满足我的需要。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多