流畅的NHibernate一对多级联删除如果在其他任何地方没有引用多边

时间:2014-04-25 09:49:27

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我有一个有效的解决方案,但有兴趣知道是否有办法通过流畅的映射实现这一目标..

为简单起见,我将使用一个说明性的例子:

class Tag {
    string name;
    IList<Book> books;
}

class Book {
    string title;
    Tag primaryTag;
}

有一个商业案例,书籍被删除,现在,我查询数据库以检查是否有任何其他书籍将当前标签作为主要标签。如果没有,我删除该书,然后删除该标签,因为它没有在其他任何地方使用。如果使用标签,我只会删除该书。

现在轮到你了......你知道使用映射实现这一目标的方法吗?我尝试了以下方法:

BookMap : ClassMap<Book> {
    ...
    References(x => x.primaryTag)
    .Cascade.All()  //the collection in TagMap is set to "inverse"
}

但毫不奇怪,当标签用于其他书籍时,它会抛出外键约束错误。

此致 马丁

1 个答案:

答案 0 :(得分:0)

没有办法做到这一点。 NHIbernate正在模仿您在Sql Server配置中使用级联删除操作所能做的事情。在Sql Server中没有使用触发器的情况下,没有办法找到父级并删除“孤儿”。

有一种方法可以使用“Interceptors”模拟NHibernate中的触发器 - 一种在特定实体上侦听CRUD然后执行操作的方法。但实际上它是一种反模式,因为你可以在移除Tag的方法中添加相同的代码(而不是像下面那样隐藏/模糊的方法,这对于审计等交叉问题很有用)。 p>

This is a really nice article关于如何做到这一点(但那里只有google“NHibernate拦截器”)。

我确保使用Session.Delete(entity)来确保从Session中移除已删除的实体(为了理智)而不是