我有一个父对象,它与子对象的IList有一对多的关系.删除子对象的最佳方法是什么?我没有删除父母.我的父对象包含一个IList子对象.以下是一对多关系的映射:
如果我尝试使用clear()从集合中删除所有对象,然后调用SaveOrUpdate(),我会得到以下异常:
System.Data.SqlClient.SqlException: Cannot insert the value NULL into column
如果我尝试单独删除子对象然后从父对象中删除它,我得到一个例外:
deleted object would be re-saved by cascade
这是我第一次处理在NHibernate中删除子对象.我究竟做错了什么?
编辑:只是为了澄清 - 我不是试图删除父对象,只是删除子对象.我将父母的关系设置为一对多.我是否还需要在子对象映射上创建多对一关系?
您收到第一个错误,因为当您从集合中删除项目时,NHibernate的默认操作模式是简单地破坏关联.在数据库中,NHibernate尝试将子行上的外键列设置为null.由于您不允许该列中的空值,因此SQL Server会引发错误.清除集合不一定会删除子对象,但一种方法是设置cascade = all-delete-orphan.这告诉NHibernate它应该删除新的孤立行而不是设置外键列.
您收到第二个错误,因为当您调用SaveOrUpdate时,NHibernate会首先删除所有子对象.然后,因为两个关系都没有标记为反向,所以NHibernate还尝试将子表中的外键列设置为null.由于行已被删除,因此您收到第二个错误.您需要在关系的一侧设置inverse = true来解决此问题.这通常在一个(主键或父键)侧完成.如果你不这样做,NHibernate将为关系的每一方做出适当的更新.不幸的是,运行两个更新不适合做.
你应该始终将你人际关系的一面标记为反面.根据您的编码方式,您可能需要也可能不需要使用级联.如果您想在使用Clear()时尝试删除一次删除,则需要定义级联.