【问题标题】:Fluent NHibernate One-To-Many Cascade Delete if Many-Side is not referenced anywhere elseFluent NHibernate One-To-Many Cascade Delete if Many-Side 没有在其他任何地方引用
【发布时间】:2014-04-25 09:49:27
【问题描述】:

我有一个可行的解决方案,但很想知道是否有办法通过流畅的映射来实现这一点..

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

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"
}

但不出意外,在其他书籍中使用该标签时会抛出外键约束错误。

问候, 马丁

【问题讨论】:

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


    【解决方案1】:

    没有办法做到这一点。 NHIbernate 正在模仿您可以在 Sql Server 配置中使用 cascade-deletes 执行的操作。如果不使用 Sql Server 中的触发器,就无法到达父级并删除“孤儿”。

    有一种方法可以使用“Interceptors”在 NHibernate 中模拟触发器 - 一种在特定实体上侦听 CRUD 然后执行操作的方法。但实际上它是一种反模式,因为您也可以将相同的代码添加到删除标签的方法中(而不是像下面这样的一些隐藏/晦涩的方法,这对于诸如审计等横切关注点很有用)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多