Database 多个键的nHibernate Cascade=“删除孤立项”

Database 多个键的nHibernate Cascade=“删除孤立项”,database,hibernate,nhibernate,relational-database,all-delete-orphan,Database,Hibernate,Nhibernate,Relational Database,All Delete Orphan,假设我有以下3个表: 表A、表B和表C 表C具有表a的外键。 表C具有表B的外键 当我从表B中删除一行时,我希望它删除表C中的孤立行,但前提是它不包含对表a的任何引用。如果它确实包含对表a的引用,我希望它删除表B中的行,并将表C中的外键设置为null 这可能吗?它的默认行为是什么 您的场景是典型的业务需求,而不是级联需求 正如这里详细讨论的:后面的机制与SQL级联删除/NHibernate级联删除相同 ... 当关系的语义可能涉及到描述的排他is部分时,级联删除可能有意义。例如,订单行记录是其父

假设我有以下3个表:

表A、表B和表C

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

当我从表B中删除一行时,我希望它删除表C中的孤立行,但前提是它不包含对表a的任何引用。如果它确实包含对表a的引用,我希望它删除表B中的行,并将表C中的外键设置为null


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

您的场景是典型的业务需求,而不是级联需求

正如这里详细讨论的:后面的机制与SQL级联删除/NHibernate级联删除相同

... 当关系的语义可能涉及到描述的排他is部分时,级联删除可能有意义。例如,订单行记录是其父订单的一部分,并且订单行永远不会在多个订单之间共享。如果订单消失,订单行也应该消失,没有订单的行将是一个问题。 Cascade Delete的典型示例是SomeObject和SomeObjectItems,其中items记录在没有相应主记录的情况下存在没有任何意义。 ... 同样,虽然这些都是关于SQL server上的特性,但它们也适用于NHibernate级联特性

因此,在您的案例中,删除有一个相当复杂的逻辑,答案应该是:

将删除定义移到数据层NHibernate映射之外 将其放在业务层内部。围绕此创建规则,在测试中确保您的逻辑在pesistence引擎(即NHibernate)上正常工作 一旦用户调整他们的需求,将来就可以从您的/自定义删除逻辑中获利。你不会受到NHibernate的限制。。。