对于多个键,nHibernate Cascade =“Delete-Orphan”

时间:2014-11-25 04:18:32

标签: database hibernate nhibernate relational-database all-delete-orphan

假设我有以下3个表格:

表A,表B&表C.

表C具有表A的外键。 表C具有表B的外键。

当我从表BI中删除一行时,希望它删除表C中的孤立,但前提是它不保留对表A的任何引用。如果它确实持有对表的引用AI希望它删除表B中的行,并在表C中将外键设置为null。

这甚至可能吗?它的默认行为是什么?

1 个答案:

答案 0 :(得分:0)

您的方案是典型的“业务要求”,而不是“级联”要求。

正如此处详细讨论的那样:When/Why to use Cascading in SQL Server? (SQL级联删除/ NHibernate级联删除后面的机制相同)

  
      
  • ...
  •   
  • 当关系的语义可能涉及排他性“属于”描述时,级联删除可能有意义。例如,OrderLine记录是其父订单的一部分,OrderLines永远不会在多个订单之间共享。如果订单消失,OrderLine也应如此,没有订单的行将是一个问题。
  •   
  • Cascade Delete的规范示例是SomeObject和SomeObjectItems,如果没有相应的主记录,项目记录就没有任何意义。
  •   
  • ...
  •   

同样,虽然这些是关于SQL服务器的功能,但它们也适用于NHibernate级联功能。

所以,在你的情况下,有一个非常复杂的删除逻辑,答案应该是:

  • 将删除定义移到数据层之外(NHibernate映射)
  • 将其放在Business图层内。创建规则,在测试中确保您的逻辑正在工作(无论在pesistence引擎上,即NHibernate)
  • 一旦用户调整他们的需求,
  • 将来/您的/自定义删除逻辑获利。你不会受到NHibernate的限制......