0

假设我有以下 3 个表:

表 A、表 B 和表 C。

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

当我从表 BI 中删除一行时,希望它删除表 C 中的孤儿,但前提是它不包含对表 A 的任何引用。如果它确实包含对表 AI 的引用,则希望它删除表 B 中的行和在表 C 中将外键设置为空。

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

4

1 回答 1

0

您的场景是典型的“业务需求”而不是“级联”需求。

如此处详细讨论:何时/为什么在 SQL Server 中使用级联? (SQL 级联删除/NHibernate 级联删除的机制相同)

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

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

因此,在您的情况下,关于删除的逻辑非常复杂,答案应该是:

  • 将删除定义移到数据层之外(NHibernate 映射)
  • 将其放在业务层内。围绕它创建规则,确保在测试中您的逻辑正常工作(无论在持久引擎上,即 NHibernate 上)
  • 一旦用户调整他们的需求,将来从您/自定义的删除逻辑中获利。您将不受 NHibernate 的限制...
于 2014-11-25T05:29:41.980 回答