2010-04-28 73 views
2

使用NHibernate构建了大部分DAL后,我发现SQL Server的Cascade On Delete规则也需要在我的HBM文件中考虑。我一直在为我的所有藏品使用手提袋,但似乎没有办法为袋子添加cascade =“delete”属性。我可以将所有行李更改为集合,但这似乎意味着我将我的模型上的所有IList <> s更改为PersistentGenericSet <>,我不太喜欢这样做。Hibernate级联删除包

有什么建议吗?

安东尼

回答

4

有两个独立的,但相关的概念:NHibernate的级联规则,DB级联。

后者是key元素上实际配置时,如果FK有ON DELETE CASCADE,这是包应该是什么样子:

<bag name="Children" ...> 
    <key column="ParentId" on-delete="cascade"/> 
    <one-to-many class="Child"/> 
</bag> 
+0

这是正确的,但我想指出,从NHibernate创建数据库脚本时使用on-delete设置。它将通过删除级联创建一个外键。它不会级联删除你的对象。 – 2010-04-28 15:04:48

+0

实际上,它修改了NHibernate的行为,因为它现在意识到*在删除级联*行为上的存在,因此,如果您有'cascade =“all”',它将依赖于DB来执行它而不是删除子对象一个接一个。 – 2010-04-28 18:43:39

+0

刚刚尝试过,我得到以下错误: 只有反向一对多关联可能会使用on-delete =“cascade” – littlecharva 2010-04-29 10:03:56

2

您可以添加一个级联属性包映射。 documentation列出了属性cascade="all|none|save-update|delete|all-delete-orphan"的几个选项。一对多关系中最常用的选项是all-delete-orphan。将级联设置为此值将导致所有数据库操作级联到集合,并且如果将子对象从集合中删除(孤立),子对象将被删除。

数据库级联类似,但不提供自动删除孤儿子记录的功能。在NHibernate和数据库中设置级联选项有点多余,但如果您有其他系统直接访问数据库,可能会很有用。