NHibernate 多对多删除导致外键违规

Posted

技术标签:

【中文标题】NHibernate 多对多删除导致外键违规【英文标题】:NHibernate many-to-many delete causing foreign key violation 【发布时间】:2009-11-02 23:52:37 【问题描述】:

我在 NHibernate 中的一个非常简单的设置有问题。 (我正在使用 Fluent Nhibernate)

我有如下两个对象,设置了双向多对多映射。

项目

-- 类别(IList)

类别

-- 项目 (IList) -- Inverse = True

这个模型在 db 中符合预期。

如果我尝试删除项目,NHibernate 在多对多表中执行删除,然后按预期删除项目。

但是,如果我尝试删除一个类别,NHibernate 会抛出一个异常,它会违反外键约束。

我在两边都尝试了 inverse="true" 但是当我尝试删除项目或类别时抛出异常(取决于 inverse="true" 的位置)。如果我删除了 inverse=" true" 从双方来看,删除在任一端都按预期工作。但这会在保存和更新时导致重复输入。

谁能告诉我哪里出错了?

【问题讨论】:

【参考方案1】:

您是否有可能没有同步整个对象图?您显示的架构表明 Project 有一个类别的集合,而 Category 有一个项目的集合。 Hibernate 希望您在对象图中保持关联同步。要删除一个类别(例如),请先尝试清除其项目集合,然后从与其关联的任何项目的“类别”集合中删除该类别。

【讨论】:

我没有在同步之前明确清除集合。虽然这可能有效,但我不确定为什么我需要在关系的一端而不是另一端这样做。当然,我应该能够只删除该项目,NHib 将清除与该项目相关的任何多对多列。对象没有紧密绑定,可能存在不存在多对多关系的项目和类别。 底层 SQL 没有谁拥有关系的概念。如果你有一个双向关联,Hibernate 只需要来自一侧的信息。我相信 Hibernate 的实现在保存/更新时忽略了标记为 inverse="true" 的一侧 - 这可以解释为什么它以一种方式而不是另一种方式工作。将您正在做的事情想象为在删除对象之前从映射表中删除条目。无论如何尝试一下,看看它是否能解决您的问题。 感谢 RMorrisey 的帮助。这是否意味着在提交任何 NHIb 更新之前,我应该在我的业务逻辑中手动评估和清除所有关系?我不能在多对多关系中使用 Cascase All/Delete 等,因为它会在可能有其他关系时删除所有内容。我还没有机会尝试(工作量太大!)。 @WDuffy:据我所知,在最近的一些测试中,您必须在提交之前手动处理业务模型中的所有关系。

以上是关于NHibernate 多对多删除导致外键违规的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate教程(11)--多对多关联查询

在 NHibernate 中定义多对多关系以允许删除但避免重复记录的正确方法是啥

Symfony 固定装置和多对多关系(学说)

NHibernate 和多对多映射

流利的 NHibernate 多对多创建附加表

NHibernate 具有同一类的多对多