0

我有子表,有外鍵引用兩個其他表,Parent1 & Parent2(這些不是這些表的真實名稱)。 Parent1 & Parent2與祖父母都有一對多的關係。 Child表是建立Parent1和Parent2之間多對多關係的連接表,但作爲自己的「映射實體」暴露給Breeze。級聯刪除不與微風

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

然而,當我使用微風

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

我收到以下異常在我的應用程序執行下面的代碼。

類型的異常「System.Exception的」發生在 Breeze.ContextProvider.dll但在用戶代碼中沒有處理

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

該聲明已終止。

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

回答

3

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

  • 然後刪除父刪除兒童

    這標誌着父爲刪除,並會迫使孩子們的外鍵爲null或取決於是否外鍵屬性鍵的默認值的更新可以爲空或不可以。這個規則的一個例外是微風不會嘗試修改主鍵,所以如果子鍵的外鍵也是主鍵的一部分,則微風不會嘗試修改它。

    所有的子導航屬性現在都將返回空數組或null,具體取決於導航屬性是標量還是非標量。此時,由於外鍵改變,每個孩子將被標記爲已修改。

    然後孩子們將被標記爲刪除。然後

  • 刪除兒童的父(推薦)

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

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

+0

這是我最終選擇的路線(刪除孩子然後是父母),但是我希望有一種方法可以將這種邏輯壓入數據庫,這樣數據模型的複雜性就會盡可能地被封裝起來。我想這可以用INSTEAD OF DELETE或AFTER DELETE來完成,但在客戶端執行它會更有意義,因爲我想彈出一個「DELETING THIS WILL DELSO THESE ...」警告,當有一個依賴關係的實體無論如何都會被刪除。 – user1569339 2014-11-06 19:25:31

+0

Breeze代碼的更新是否同時處理級聯?我正在爲Breeze實現一個基於django的服務器接口,並且遇到了完全相同的問題。 – 2016-06-02 19:16:41