当前位置:  开发笔记 > 数据库 > 正文

如何在NHibernate中删除子对象?

如何解决《如何在NHibernate中删除子对象?》经验,为你挑选了1个好方法。

我有一个父对象,它与子对象的IList有一对多的关系.删除子对象的最佳方法是什么?我没有删除父母.我的父对象包含一个IList子对象.以下是一对多关系的映射:


  
  

如果我尝试使用clear()从集合中删除所有对象,然后调用SaveOrUpdate(),我会得到以下异常:

System.Data.SqlClient.SqlException: Cannot insert the value NULL into column

如果我尝试单独删除子对象然后从父对象中删除它,我得到一个例外:

deleted object would be re-saved by cascade

这是我第一次处理在NHibernate中删除子对象.我究竟做错了什么?

编辑:只是为了澄清 - 我不是试图删除父对象,只是删除子对象.我将父母的关系设置为一对多.我是否还需要在子对象映射上创建多对一关系?



1> Chuck..:

您收到第一个错误,因为当您从集合中删除项目时,NHibernate的默认操作模式是简单地破坏关联.在数据库中,NHibernate尝试将子行上的外键列设置为null.由于您不允许该列中的空值,因此SQL Server会引发错误.清除集合不一定会删除子对象,但一种方法是设置cascade = all-delete-orphan.这告诉NHibernate它应该删除新的孤立行而不是设置外键列.

您收到第二个错误,因为当您调用SaveOrUpdate时,NHibernate会首先删除所有子对象.然后,因为两个关系都没有标记为反向,所以NHibernate还尝试将子表中的外键列设置为null.由于行已被删除,因此您收到第二个错误.您需要在关系的一侧设置inverse = true来解决此问题.这通常在一个(主键或父键)侧完成.如果你不这样做,NHibernate将为关系的每一方做出适当的更新.不幸的是,运行两个更新不适合做.

你应该始终将你人际关系的一面标记为反面.根据您的编码方式,您可能需要也可能不需要使用级联.如果您想在使用Clear()时尝试删除一次删除,则需要定义级联.


它属于不持有外键的类...通常是父类.
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有