开发者

nhibernate does not cascade delete children

开发者 https://www.devze.com 2022-12-21 21:24 出处:网络
The scenario is as follows, I have 3 objects (i simplified the names) named Parent, parent\'s child & child\'s child

The scenario is as follows,

I have 3 objects (i simplified the names) named Parent, parent's child & child's child

parent's child is a set in parent, and child's child is a set in child.

mapping is as follows (relevant parts)

parent

<set name="parentset"
     table="pc-table"
     lazy="false"
     fetch="subselect"
     cascade="all-delete-orphan"
     inverse="true">
  <key column=FK_ID_PC" on-delete="cascade"/>
  <one-to-many class="parentchild,parentchild-ns"/>
</set>

parent's child

<set name="childset"
     table="cc-table"
     lazy="false"
     fetch="subselect"
     cascade="all-delete-orphan"
     inverse="true">
  <key column="FK_ID_CC" on-delete="cascade"/>
  <one-to-many class="childschild,childschild-ns"/>
</set>

What i want to achieve is that when i delete the parent, there would be a cascade delete all th开发者_如何转开发e way trough to child's child. But what currently happens is this.

(this is purely for mapping test purposes) getting a parent entity (works fine)

IQuery query = session.CreateQuery("from Parent where ID =" + ID);
IParent doc = query.UniqueResult<Parent>();

now the delete part

session.Delete(doc);
transaction.Commit();

After having solved the 'cannot insert null value' error with cascading and inverse i hopes this would now delete everything with this code, but only the parent is being deleted.

Did i miss something in my mapping which is likely to be missed? Any hint in the right direction is more than welcome!


Diego, thank you for the to the point answer. (and explanation)

I went with removing the on-delete="cascade", this because I like as much control as possible in code and not in the database.

The code posted below is the (working) result.

parent

<set name="parentset"     
     table="pc-table"     
     cascade="all-delete-orphan"     
     inverse="true"
     batch-size="5">     
  <key column=FK_ID_PC"/>     
  <one-to-many class="parentchild,parentchild-ns"/>     
</set>

parent's child

<set name="childset"            
     table="cc-table"     
     cascade="all-delete-orphan" 
     batch-size="5"  
     inverse="true">            
  <key column="FK_ID_CC">            
  <one-to-many class="childschild,childschild-ns"/>            
</set>

Hope this helps people with the same problem!


By setting on-delete="cascade" on the keys, you are letting the DB handle the cascading.

Are you generating your schema with NHibernate?

I just reproduced your example and it worked fine with and without that attribute. When removing it, NHibernate does the cascading.

BTW, using lazy="false" fetch="subselect" is not something that you should do by default. If you remove those attributes, leave on-delete="cascade" and change cascade to save-update, you'll only have two queries to retrieve and delete a Parent.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号