4

我有一个“照片”课程和一个“评论”课程。一张照片可以有多个评论分配给它。

我在我的 HBM 映射文件中将此配置为一对多关系,并针对 Photo.hbm.xml 映射文件中的“评论”包设置了 cascade="all-delete-orphan"。

但是,如果我尝试删除具有 1 个或多个相关评论的照片,我会收到“DELETE 语句与 REFERENCE 约束“FK_Comments_Photos”冲突”

我针对 Photo.hbm.xml 中的 Comments 包尝试了其他几个级联选项,但无论我将其设置为什么,我每次都会得到相同的结果。我只想能够删除照片并自动删除任何相关的评论。

这是我的照片映射(为简洁而编辑):

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" .... default-access="property" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Photo" table="Photos">
    <id name="PhotoId" unsaved-value="0">
        <column  name="PhotoId" />
        <generator class="native" />
    </id>
    ...
    <bag name="Comments" table="Comments" cascade="all-delete-orphan" order-by="DateTimePosted desc" where="Approved=1">
        <key column="PhotoId" />
        <one-to-many class="Comment" />
    </bag>
</class>

这是我的评论映射(为简洁而编辑):

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" ... default-access="property" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Comment" table="Comments">
    <id name="CommentId" unsaved-value="0">
        <column name="CommentId"></column>
        <generator class="native" />
    </id>
    ...
    <property name="Author" not-null="true" />
    <property name="Body" not-null="true" />
    <property name="Approved" not-null="true" />
    <many-to-one name="Photo" not-null="true">
        <column name="PhotoId" />
    </many-to-one>
</class>

当我尝试删除带有相关评论的照片时,是否有人对为什么没有发生级联有任何建议?

更新:我可以让级联发生的唯一方法是在 SQL Server 中针对这种与“级联”的关系配置“删除规则”,这样做意味着我不需要在我的 NHibernate 中指定任何级联操作映射。然而,这对我来说并不理想——我希望能够在理想情况下配置 NHibernate 映射中的级联行为,所以我仍然很困惑为什么它似乎没有注意到我的 NHibernate级联设置?

4

4 回答 4

4

我的猜测是问题出在评论映射中的多对一设置为 not-null="true" 的事实。因此,NHibernate 在删除 Photo 对象之前不允许将此属性临时设置为 null,因此何时删除 Photo 对象 SQL Server 会引发外键异常。

如果我没记错删除时的操作顺序是:

  1. 在所有子对象中将外键值设置为 null
  2. 删除父对象
  3. 删除所有子引用

尝试从多对一中删除 not-null="true" ,看看会发生什么。

于 2011-01-21T12:35:05.280 回答
2

尝试使用inverse="true"映射的包集合。

于 2011-01-21T09:13:16.867 回答
1

我有类似的问题 1 天.. 并为此感到沮丧。

最后,解决方案归结为数据库。我不得不更改“插入更新规范”“删除规则”中的 FK 键约束:从“无操作”到“级联”

此外,您还可以设置“更新规则”:从“无操作”到“级联”

于 2011-05-17T06:29:13.317 回答
0

可以在 NH 中指定 delete-cascade 选项:

<bag name="Comments" cascade="all-delete-orphan" order-by="DateTimePosted desc" where="Approved=1">
    <key column="PhotoId" on-delete="cascade"/>
    <one-to-many class="Comment" />
</bag>

您可能应该将其反转。然后我想知道您的 FK_Comments_Photos 列是在哪里指定的。

于 2011-06-28T12:12:05.763 回答