我有每個類型繼承表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和所有相關記錄的記錄,但不能從
爲什麼?如何修復它?
我有每個類型繼承表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和所有相關記錄的記錄,但不能從
爲什麼?如何修復它?
這是一個衆所周知的問題,我會說它是一個錯誤。顯然,只從表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);
應該從兩個A
和A1
表中刪除,從而在表A
固定的孤立記錄的問題。不幸的是,您不得不從數據庫加載孩子以正確刪除父母。
以下是有關這個問題的另一種自問自答:Problems using TPT (Table Per Type) in EF 4.2 and deletion of parent objects
我有同樣的問題,一個同事告訴我在做刪除(O)之前遍歷項目的集合,突然它的所有工作。
有什麼建議嗎?我認爲這是一個微不足道的問題。 – Developex 2012-01-30 13:45:28