【问题标题】:Delete child objects when parent reference is deleted删除父引用时删除子对象
【发布时间】:2017-08-24 09:04:50
【问题描述】:

我有以下休眠映射:

<class name="Folder" >
    <id name="Id">
        <generator class="native"/>
    </id>
    <many-to-one name="Owner"
         not-null="false" fetch="select" column="OwnerFK" not-found="ignore" lazy="proxy" />
    <property name="Name" />
    <many-to-one name="ParentFolder" column="ParentId" 
        not-found="ignore" lazy="proxy" not-null="false"/>
</class>

ParentId 列引用同一个表的Id,这样我就知道子文件夹是在哪个父级创建的。

当我删除父文件夹时,我希望子文件夹也被删除,如果只删除子文件夹,那么父文件夹不应该受到影响。

我在parentId 列上尝试了cascade="all",但是当我只删除孩子时,它删除了我的父文件夹。

这可以使用 Hibernate 实现吗?

【问题讨论】:

    标签: c# entity-framework hibernate nhibernate cascading-deletes


    【解决方案1】:

    是的,这可以使用 Hibernate 来实现。您将不得不稍微更改您的映射。

    <class name="Folder" >
        <id name="Id">
            <generator class="native"/>
        </id>
        <many-to-one name="Owner"
             not-null="false" fetch="select" column="OwnerFK" not-found="ignore" lazy="proxy" />
        <property name="Name" />
    
        <many-to-one name="ParentFolder" column="ParentId" 
            not-found="ignore" lazy="proxy" not-null="false"/>
    
        <bag name="ChildFolders" cascade="delete" inverse="true" fetch="select">
           <key column="ParentId" not-null="false"/>
           <one-to-many class="Folder"/>
        </bag>
    </class>
    

    每个元素都可以有一个父元素和一个子元素,因此您需要一个包来获取子元素,并且需要一个多对一的元素来获取父元素。

    因此,当您尝试删除父级时,您的子级上会显示 cascade="delete" 以确保没有孤儿。

    【讨论】:

      【解决方案2】:

      没有 NHibernate 不能做到这一点。您需要让模型列出结构并删除每个对象,因为您的 NHibernate 映射到父级而不是子级。

      【讨论】:

        猜你喜欢
        • 2019-11-25
        • 2021-07-23
        • 2013-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        • 2021-11-11
        相关资源
        最近更新 更多