2012-01-30 96 views
13

我有每個類型繼承表DB模式。 例如,實體是A,B,C,A1,A2。 基數 - A 派生 - A1,A2。 另 - B,C. 所以,A具有1至1關聯A1和A2。 B和C分別與A1和A2具有關聯(1到多個,DB側有OnDelete動作)。級聯刪除在實體框架(每個類型繼承表)

問題

我想的B刪除記錄,因此,我希望EF也刪除其關聯到當前B的記錄的所有A1的對象。

最後,EF從A1刪除B和所有相關記錄的記錄,但不能從

爲什麼?如何修復它?

+0

有什麼建議嗎?我認爲這是一個微不足道的問題。 – Developex 2012-01-30 13:45:28

回答

7

這是一個衆所周知的問題,我會說它是一個錯誤。顯然,只從表A1中刪除派生實體屬性的記錄是不正確的。數據庫中的其餘數據(在表A中)確實表示另一種對象類型。換句話說:這DELETE實際上並沒有刪除實體,但它改變了實體的類型=轉化A1類型的對象爲A類型的對象 - 這使得如果A是一個抽象的實體甚至更少的意義。

here建議的解決方法(據我所知)是醜陋:

var b = context.Bs.Include("A1s").Single(b => b.Id == 1); 
foreach (var a1 in b.A1s.ToList()) 
    context.As.Remove(a1); 
context.Bs.Remove(b); 
context.SaveChanges(); 

context.As.Remove(a1);應該從兩個AA1表中刪除,從而在表A固定的孤立記錄的問題。不幸的是,您不得不從數據庫加載孩子以正確刪除父母。

以下是有關這個問題的另一種自問自答:Problems using TPT (Table Per Type) in EF 4.2 and deletion of parent objects

+0

謝謝! mictosoft團隊知道這個bug嗎? :)你知道什麼時候它會被修復嗎?因爲這種方法非常難看。但它的工作:) – Developex 2012-01-31 07:59:22

+0

@ user861108:不,我不知道是否或何時將被修復。我甚至不知道MS是否認爲這個問題是一個錯誤。 – Slauma 2012-01-31 11:46:20

+0

我認爲在這些情況下,如果使用其他類型的繼承,則全部都可以。我使用表類型繼承。也許如果我將使用Table Per Hierarchy,這個問題就不會出現。你怎麼看 ? – Developex 2012-01-31 14:49:36

0

我有同樣的問題,一個同事告訴我在做刪除(O)之前遍歷項目的集合,突然它的所有工作。