NHibernate一对多删除不级联

时间:2011-01-21 08:48:27

标签: asp.net nhibernate relational-database cascading-deletes nhibernate-cascade

我有一个'Photo'课程和一个'Comment'课程。照片可以分配多个注释。

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

但是,如果我尝试删除包含1个或更多注释的Photo,我会收到'DELETE语句与REFERENCE约束冲突“FK_Comments_Photos”'

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

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

<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中的“删除规则”配置为与“Cascade”的关系,这样做意味着我不会需要在我的NHibernate Mapping中指定任何级联动作。但是,这对我来说并不理想 - 我希望能够在NHibernate Mapping中理想地配置级联行为,所以我仍然感到困惑,为什么它似乎没有注意到我的NHibernate级联设置?

4 个答案:

答案 0 :(得分:4)

我的猜测是,问题来自于Comment映射中的多对一设置为not-null =&#34; true&#34; 因此,NHibernate在删除Photo对象之前不允许暂时将此属性设置为null,因此在删除Photo对象时,SQL Server会抛出外键异常。

如果我正确记得删除时的操作顺序是:

  1. 在所有子对象中将外键值设置为null
  2. 删除父对象
  3. 删除所有子参考
  4. 尝试删除not-null =&#34; true&#34;从多对一,看看会发生什么。

答案 1 :(得分:2)

尝试使用映射的行李集合上的inverse="true"

答案 2 :(得分:1)

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

最后,解决方案归结为DB。 我必须在“INSERT UPDATE SPECIFICATION”中更改FK键约束 “删除规则”:从“无行动”到“级联”

另外你也可以设置 '更新规则':从'无行动'到'级联'

答案 3 :(得分: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列在哪里。