簡體   English   中英

級聯刪除不適用於微風

[英]Cascade Delete Not Working with Breeze

我有Child表,其外鍵引用另外兩個表,Parent1和Parent2(這些不是這些表的真實名稱)。 Parent1和Parent2都與祖父母有一對多的關系。 Child表是一個連接表,在Parent1和Parent2之間建立多對多關系,但是它作為自己的“映射實體”暴露給Breeze。

我在這兩個外鍵上都有級聯刪除設置,當我從SQL Server Management Studio中刪除Parent1或Parent2表中的一行時,級聯正常工作,並刪除子表中的相應行。

但是當我使用Breeze在我的應用程序中執行以下代碼時

function removeParent1(grandParent, parent1) {
    var index = grandParent.parent1s.indexOf(parent1);
    grandParent.parent1s.splice(index, 1);
    parent1.entityAspect.setDeleted();
}

我收到以下異常。

Breeze.ContextProvider.dll中出現“System.Exception”類型的異常,但未在用戶代碼中處理

附加信息:UPDATE語句與FOREIGN KEY約束“FK_dbo.Child_dbo.Parent1_Parent1Id”沖突。 沖突發生在數據庫“DB”,表“dbo.Parent1”,列“Id”中。

該語句已終止。

我無法弄清楚發生了什么。 Breeze是否嘗試使用NULL外鍵更新Child行?

Breeze不會自動支持級聯刪除。 但是,您可以在代碼中執行此類刪除操作。 刪除父項及其關聯的子項時,基本上有兩種選擇,執行這些操作的順序會對該過程產生重大影響。

  • 刪除父項然后刪除子項

    這會將父標記為已刪除,並將強制將子項的外鍵更新為null或鍵的默認值,具體取決於外鍵屬性是否可為空。 此規則的一個例外是breeze將永遠不會嘗試修改主鍵,因此如果子鍵的外鍵也是主鍵的一部分,則breeze不會嘗試修改它。

    現在,所有子導航屬性都將返回空數組或null,具體取決於導航屬性是否為標量。 此時,由於外鍵更改,每個子項都將標記為已修改。

    然后將每個孩子標記為已刪除。

  • 刪除子項然后父項(推薦)

    每個孩子都會被標記為已刪除。 外鍵不會更改,但相應的導航屬性將返回null,而不是返回父項。 此時,之前返回這些子節點的所有父級導航屬性現在將返回null或空數組。 父標記已刪除。 它的任何一個孩子都沒有變化(因為此時它沒有變化)。

所以在你的情況下,我會先嘗試刪除孩子,然后再刪除父母。 這樣,您不太可能在服務器上保存失敗,因為在保存之前沒有修改任何子項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM