2010-01-29 72 views
0

我想實現一個邏輯刪除仙境所有我的實體。所有都有一個IsDeleted布爾屬性。我也想級聯協會刪除。我開始通過向datacontext添加實體的部分方法。Linq邏輯刪除與協會

partial void DeleteQuestion(Question instance) 
{ 
    instance.IsDeleted = true; 
    ExecuteDynamicUpdate(instance); 
    foreach (var answer in instance.Answers) 
    { 
     DeleteAnswer(answer); 
    } 
} 

這會在ExecuteDynamicUpdate引發錯誤Incorrect syntax near the keyword 'WHERE'。看看sql分析器,我可以看到set子句是空白的,它不記錄IsDeleted = true;作爲一個變化。我檢查了IsDeletedChanging事件,它確實被解僱了,但我猜這次更改集已經建立了。

我也嘗試提交更改,而不是調用ExecuteDynamicUpdate,但這引發異常The operation cannot be performed during a call to SubmitChanges.

我看到相同的討論here,唯一的分辨率爲使用存儲過程,我寧願不做。

所以我想讓我們問SO社區,並獲得Google結果頂部的正確答案。這個話題似乎很少。

非常感謝。

+0

有點偏離主題,但迭代所有答案並逐個刪除它們會產生非常差的性能。您應該考慮批量刪除它們。 – 2010-01-29 13:37:35

+0

正確。當我找到更新的方法時,我會重構。 我初期嘗試了db.Answers.DeleteAllOnSubmit(instance.Answers),但是這會引發「在調用SubmitChanges異常期間無法執行的操作」 – madcapnmckay 2010-01-29 13:50:54

回答

1

你是否真的需要在整個遏制過程中堅持刪除狀態?

假設您有一個問題「Q」並回答「A」和「B」。 在某些時候,您可以刪除「A」。 (狀態1)「Q有B」。

現在你可以安全刪除「Q」,期待當你取消刪除「Q」時你會得到(狀態1)。 但safedelete已將「B」設置爲已刪除狀態,並且取消刪除已將「Q」的所有子項設置爲未刪除狀態,則您將獲得「Q has A,B」。 安全刪除和未刪除操作都已經破壞了兒童收集元素的狀態。

我把這個概念稱爲「解構編輯」,這意味着操作是不可逆的,並且使得邏輯刪除幾乎沒用。

我建議使用「非描述性編輯」,這意味着從包含層次結構推斷IsDeleted狀態。如果父母被刪除,這意味着孩子也被視爲已被刪除。

0

看起來你是直接在代碼中調用DeleteQuestion。你不應該這樣做。這部分方法被稱爲Delete操作的結果。因此,在部分方法中傳遞的實例已經作爲Delete的目標,這就是Linq to SQL調用此方法的原因。它看起來像你自己調用這個方法,然後試圖刪除作爲參數傳遞的實例。這不是你想要做的。

+0

我不是自己調用此方法,而是攔截刪除調用以更改其行爲。我想將物理刪除改爲邏輯刪除。任何想法我應該做什麼? – madcapnmckay 2010-01-29 12:59:57

+0

@madcapnmckay - 物理刪除和邏輯刪除有什麼區別? – 2010-01-29 13:18:58

+0

物理 - 行被刪除。該行保持邏輯但被標記爲已刪除。 – madcapnmckay 2010-01-29 13:49:05