使用NHibernate构建了大部分DAL后,我发现SQL Server的Cascade On Delete规则也需要在我的HBM文件中考虑。我一直在为我的所有藏品使用手提袋,但似乎没有办法为袋子添加cascade =“delete”属性。我可以将所有行李更改为集合,但这似乎意味着我将我的模型上的所有IList <> s更改为PersistentGenericSet <>,我不太喜欢这样做。Hibernate级联删除包
有什么建议吗?
安东尼
使用NHibernate构建了大部分DAL后,我发现SQL Server的Cascade On Delete规则也需要在我的HBM文件中考虑。我一直在为我的所有藏品使用手提袋,但似乎没有办法为袋子添加cascade =“delete”属性。我可以将所有行李更改为集合,但这似乎意味着我将我的模型上的所有IList <> s更改为PersistentGenericSet <>,我不太喜欢这样做。Hibernate级联删除包
有什么建议吗?
安东尼
有两个独立的,但相关的概念:NHibernate的级联规则,DB级联。
后者是key
元素上实际配置时,如果FK有ON DELETE CASCADE
,这是包应该是什么样子:
<bag name="Children" ...>
<key column="ParentId" on-delete="cascade"/>
<one-to-many class="Child"/>
</bag>
您可以添加一个级联属性包映射。 documentation列出了属性cascade="all|none|save-update|delete|all-delete-orphan"
的几个选项。一对多关系中最常用的选项是all-delete-orphan
。将级联设置为此值将导致所有数据库操作级联到集合,并且如果将子对象从集合中删除(孤立),子对象将被删除。
数据库级联类似,但不提供自动删除孤儿子记录的功能。在NHibernate和数据库中设置级联选项有点多余,但如果您有其他系统直接访问数据库,可能会很有用。
这是正确的,但我想指出,从NHibernate创建数据库脚本时使用on-delete设置。它将通过删除级联创建一个外键。它不会级联删除你的对象。 – 2010-04-28 15:04:48
实际上,它修改了NHibernate的行为,因为它现在意识到*在删除级联*行为上的存在,因此,如果您有'cascade =“all”',它将依赖于DB来执行它而不是删除子对象一个接一个。 – 2010-04-28 18:43:39
刚刚尝试过,我得到以下错误: 只有反向一对多关联可能会使用on-delete =“cascade” – littlecharva 2010-04-29 10:03:56