2 回答

TA貢獻1864條經驗 獲得超2個贊
使用這兩種方法可以“ 從數據庫中刪除項目 ”通常不正確。確切地說,它是這樣的:
ObjectContext.DeleteObject(entity)
在上下文中標記實體Deleted
。(它EntityState
是Deleted
后)。如果你打電話SaveChanges
后EF發送SQLDELETE
語句到數據庫。如果違反了數據庫中的引用約束,則將刪除該實體,否則將引發異常。EntityCollection.Remove(childEntity)
標記父和childEntity
as 之間的關系Deleted
。如果childEntity
從數據庫中刪除了自身,并且在調用時確實發生了什么,SaveChanges
取決于兩者之間的關系類型:如果關系是可選的,即從子級引用到數據庫中的父級的外鍵允許
NULL
值,則此外部將被設置為null,如果調用SaveChanges
此NULL
值,則將該值childEntity
寫入數據庫(即兩個被刪除)。這發生在SQLUPDATE
語句中。沒有DELETE
發表聲明。如果需要關系(FK不允許
NULL
值)且關系未識別(這意味著外鍵不是子(復合)主鍵的一部分),則必須將子項添加到另一個父項或你必須明確刪除孩子(DeleteObject
當時)。如果您不執行任何這些操作,則會違反參照約束,EF會在您調用時拋出異常SaveChanges
- 臭名昭著的“ 由于一個或多個外鍵屬性不可為空而無法更改關系 ”異常或類似。如果關系正在識別(因為主鍵的任何部分都不可能是必需的
NULL
),EF也會標記childEntity
為Deleted
as。如果調用SaveChanges
SQLDELETE
語句將被發送到數據庫。如果未違反數據庫中的其他引用約束,則將刪除該實體,否則將引發異常。
我實際上對您鏈接的MSDN頁面上的 “ 備注”部分感到困惑,因為它說:“ 如果關系具有參照完整性約束,則在依賴對象上調用Remove方法會標記關系和依賴對象以進行刪除。 ”。這對我來說似乎是不準確甚至是錯誤的,因為上面的所有三種情況都有“ 參照完整性約束 ”,但只有在最后一種情況下才會刪除子。(除非它們與“ 依賴對象 ” 意味著一個參與識別關系的對象,但這可能是一個不尋常的術語。)

TA貢獻1829條經驗 獲得超6個贊
如果你真的想使用Deleted,你必須使你的外鍵可以為空,但是你最終會得到孤立的記錄(這是你不應該首先做的那個主要原因之一)。所以只需使用Remove()
ObjectContext.DeleteObject(entity)在上下文中將實體標記為已刪除。(之后刪除了EntityState。)如果之后調用SaveChanges,EF會向數據庫發送SQL DELETE語句。如果違反了數據庫中的引用約束,則將刪除該實體,否則將引發異常。
EntityCollection.Remove(childEntity)將parent和childEntity之間的關系標記為已刪除。如果從數據庫中刪除了childEntity本身,并且在調用SaveChanges時究竟發生了什么,取決于兩者之間的關系類型:
值得注意的是,設置.State = EntityState.Deleted
不會觸發自動檢測到的更改。 (檔案)
添加回答
舉報