删除父引用时删除子对象

时间:2017-08-24 09:04:51

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

我有一个以下的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"/>
</class>

ParentId列被引用到同一个表的Id,这样我就知道子文件夹的父文件已被创建。

当我删除父级时,我希望删除子文件夹,如果只删除子级,则不应影响父级。

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

可以使用Hibernate实现吗?

2 个答案:

答案 0 :(得分: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”,以确保没有孤儿。

答案 1 :(得分:0)

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