3

我有一個'照片'類和'評論'類。照片可以有多個評論分配給它。NHibernate一對多刪除不級聯

我在我的HBM映射文件中配置爲一對多關係,並且在Photo.hbm.xml映射文件中針對'評論'包設置cascade =「all-delete-orphan」。

但是,如果我嘗試刪除其中有1個或多個與其關聯註釋的照片,我得到「DELETE語句衝突與基準約束‘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映射中的任何級聯動作。然而,這對我來說並不理想 - 我希望能夠在NHibernate映射中理想地配置級聯行爲,所以我仍然困惑,爲什麼它似乎沒有注意到我的NHibernate級聯設置?

回答

4

我的猜測是,問題來自於這樣的事實,即Comment映射中的多對一設置爲not-null =「true」。 因此,在刪除Photo對象之前,NHibernate不允許將它臨時設置爲null,因此當刪除Photo對象時,SQL Server會引發外鍵異常。

如果我沒有記錯了動作的順序刪除時是:

  1. 爲null,在所有子集外鍵值對象
  2. 刪除父對象
  3. 刪除所有子引用

嘗試從多對一中刪除not-null =「true」,看看會發生什麼。

+0

感謝您的建議。我只是試過這個,但仍然是相同的問題/錯誤消息。如果我刪除SQL Server中現有的關係/約束,那麼照片記錄的刪除不會發生任何錯誤,但會將我孤立的相關注釋記錄留在數據庫中。這就像只注意SQL Server中的事物配置,並忽略SQL Server之外的任何級聯設置。 – marcusstarnes 2011-01-21 12:49:01

2

請使用inverse="true"作爲您映射的包集合。

+0

我也嘗試過(當沒有其他工作時),但不幸的是沒有成功。 – marcusstarnes 2011-01-21 09:17:22

1

我有類似的問題1天..並感到沮喪。

最後解決方案歸結爲數據庫。 我不得不改變在「INSERT,UPDATE規範」 「刪除規則」的FK主要制約因素:從「無操作」到「級聯」

此外,您還可以設置 「更新規則」:從「不採取行動」到「級聯」

0

可以指定刪除級聯選項NH:

<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列是在哪裏指定的。