4

表:多個級聯刪除在多對多關係路徑(EF 4.1)

Shop 
Product 
Category 

以下關係:

 (Shop) 1 <---> n (Categories) 
     (Shop) 1 <---> n (Products) 
(Categories) n <---> n (Products) 

THE級聯刪除:

 Shop ---> Categories ... I defined this using fluent API 
     Shop ---> Products ... I defined this using fluent API 
Categories <---> Products ... EF 4.1 automatically defines cascade for "Category_Product" join table 

問題: 上面的結果是「多個」級聯刪除路徑異常。

潛在FIXES:

  1. 卸下ManyToManyConvention,但這意味着我必須手動執行刪除在系統中,這是不切實際的每個連接表。
  2. 我可以從Shop-> Category或Shop-> Products中刪除級聯刪除。但是,我可能會有很多孤兒記錄。

你是怎麼處理這個問題的人?

謝謝

回答

4

這不是實體框架的問題,而是SQL服務器的問題。我不認爲這個例外實際上意味着循環級聯刪除。它更可能意味着多級級聯刪除路徑,因爲連接表記錄可以從商店級聯中刪除。 SQL服務器不允許這樣做,因爲它需要一些更復雜(和緩慢)的算法來正確計算哪些記錄以及何時級聯時必須刪除。

只要您打破這一點,這將意味着您必須在刪除店鋪之前手動刪除所有相關記錄(包括類別或產品)。這將需要存儲過程(或直接的SQL DELETE命令),否則你將不得不首先加載它們並逐個刪除它們。

編輯:

當您在評論指出這一點也可以通過添加BEFORE DELETE觸發器是否存在如更換一個級聯通道,將刪除相關記錄解決。

+0

是的我的意思是「多條路徑」,我的不好。我知道SQL Server的限制,但它沒有任何意義,因爲當你刪除Categories時,它會刪除JOIN TABLE中的Category_Product記錄,而不是實際的產品記錄!但SqlServer仍然將它包含在級聯路徑中......怪異的吧?所以觸發器或sprocs是唯一的方法? – Matt0 2011-05-19 22:35:37

+0

我想要一個觸發器來檢查商店何時被刪除,所有的依賴記錄也被刪除了,但是那麼ORM有什麼意義呢? :-) – Matt0 2011-05-19 22:39:37

+0

但是,如果您刪除商店,它將刪除產品和類別,一旦它們中的任何一個被刪除,它也將刪除來自連接表的記錄=刪除可以來自任何一方。 – 2011-05-19 22:41:09