2 回答

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

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