亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

實體框架.Remove()與.DeleteObject()

實體框架.Remove()與.DeleteObject()

12345678_0001 2019-07-25 16:53:20
實體框架.Remove()與.DeleteObject()您可以使用以下兩種方法從EF中刪除數據庫中的項目。EntityCollection.Remove方法ObjectContext.DeleteObject方法第一個是EntityCollection第二個,第二個是ObjectContext。什么時候應該使用?一個優先于另一個嗎?Remove()返回a bool并DeleteObject()返回void。
查看完整描述

2 回答

?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

使用這兩種方法可以“ 從數據庫中刪除項目 ”通常不正確。確切地說,它是這樣的:

  • ObjectContext.DeleteObject(entity)在上下文中標記實體Deleted。(它EntityStateDeleted后)。如果你打電話SaveChanges后EF發送SQL DELETE語句到數據庫。如果違反了數據庫中的引用約束,則將刪除該實體,否則將引發異常。

  • EntityCollection.Remove(childEntity)標記父和childEntityas 之間的關系Deleted。如果childEntity從數據庫中刪除了自身,并且在調用時確實發生了什么,SaveChanges取決于兩者之間的關系類型:

    • 如果關系是可選的,即從子級引用到數據庫中的父級的外鍵允許NULL值,則此外部將被設置為null,如果調用SaveChangesNULL值,則將該值childEntity寫入數據庫(即兩個被刪除)。這發生在SQL UPDATE語句中。沒有DELETE發表聲明。

    • 如果需要關系(FK不允許NULL值)且關系未識別(這意味著外鍵不是子(復合)主鍵的一部分),則必須將子項添加到另一個父項或你必須明確刪除孩子(DeleteObject當時)。如果您不執行任何這些操作,則會違反參照約束,EF會在您調用時拋出異常SaveChanges- 臭名昭著的“ 由于一個或多個外鍵屬性不可為空而無法更改關系 ”異常或類似。

    • 如果關系正在識別(因為主鍵的任何部分都不可能是必需的NULL),EF也會標記childEntityDeletedas。如果調用SaveChangesSQL DELETE語句將被發送到數據庫。如果未違反數據庫中的其他引用約束,則將刪除該實體,否則將引發異常。

我實際上您鏈接的MSDN頁面上的 “ 備注”部分感到困惑,因為它說:“ 如果關系具有參照完整性約束,則在依賴對象上調用Remove方法會標記關系和依賴對象以進行刪除。 ”。這對我來說似乎是不準確甚至是錯誤的,因為上面的所有三種情況都有“ 參照完整性約束 ”,但只有在最后一種情況下才會刪除子。(除非它們與“ 依賴對象 ” 意味著一個參與識別關系的對象,但這可能是一個不尋常的術語。)


查看完整回答
反對 回復 2019-07-25
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

如果你真的想使用Deleted,你必須使你的外鍵可以為空,但是你最終會得到孤立的記錄(這是你不應該首先做的那個主要原因之一)。所以只需使用Remove()

ObjectContext.DeleteObject(entity)在上下文中將實體標記為已刪除。(之后刪除了EntityState。)如果之后調用SaveChanges,EF會向數據庫發送SQL DELETE語句。如果違反了數據庫中的引用約束,則將刪除該實體,否則將引發異常。

EntityCollection.Remove(childEntity)將parent和childEntity之間的關系標記為已刪除。如果從數據庫中刪除了childEntity本身,并且在調用SaveChanges時究竟發生了什么,取決于兩者之間的關系類型:

值得注意的是,設置.State = EntityState.Deleted 不會觸發自動檢測到的更改。 檔案


查看完整回答
反對 回復 2019-07-25
  • 2 回答
  • 0 關注
  • 687 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號