2009-06-01 94 views
26

有沒有人知道如何刪除一個對象及其內部的所有相關實體,而無需手動遍歷對象圖並刪除每個對象圖?在實體框架中刪除一個對象及其所有相關實體

例如,我有SalesOrder和SalesOrderDetails之間的1:N關係。當我刪除一個SalesOrder時,我想要自動刪除所有的SalesOrderDetails。

這可能在EF嗎?

回答

26

你不應該在實體框架中這樣做。所有流行的關係數據庫都支持外鍵ON CASCADE DELETE,效率更高。我建議你就這樣做。

+7

Yeap。如果您對數據庫中的關係進行級聯刪除,並將其帶入EF模型,則EF實際上會刪除內存中的依賴實體,以嘗試保持內存對象圖與數據庫同步。但是你不應該依賴EF刪除相關的所有相關對象,這些都是數據庫的工作。 – 2009-06-02 03:43:58

7

在這篇文章中,亞歷克斯詹姆斯(誰發表他的答案),有一個關於這個話題的完整文章。

http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx

的EF負責的ObjectContext的調用SaveChanges後的正確性()。因此,EF嘗試將ObjectContext與期望的數據庫狀態同步到數據庫中預期的級聯之後。 這是一個告訴傳說,如果你打開類似SqlProfiler,的東西,你會注意到當一個委託人被刪除時,EF發出DELETE對它所知道的依賴實體的請求(即在ObjectContext中加載的)。 基本上這裏發生的事情是,實體框架期望刪除數據庫中的委託人,將刪除數據庫中的所有依賴項。所以它會發出一個冗餘的DELETE來請求自己,以便已經加載的依賴項從ObjectContext中被刪除。 關鍵要注意的是,EF 不會檢索所有依賴實體併爲它們發出刪除操作:它僅刪除已存在於內存中的依賴項。