2013-12-13 117 views
1

我試圖刪除其中一個實體,但我收到了一個奇怪的錯誤。SaveChanges上的InvalidOperationException異常

我的代碼刪除一個看起來是這樣的:

public bool Delete() 
{ 
    using (var context = new DbContext()) 
    { 
     context.Set(this.GetType()).Attach(this); 
     context.Entry(this).State = EntityState.Deleted; 

     context.SaveChanges(); 
    } 
} 

這個方法是我的實體的一部分,它自身附加(當前實體)並改變該國刪除。

上線context.SaveChanges();我收到錯誤消息:

翻譯留言(我自己翻譯):

執行被中止:關係無法改變,因爲爲atleast一個外鍵屬性沒有NULL值被允許。當關系被修改時,相關的foreignkey屬性被設置爲NULL值。如果foreignkey不支持NULL值,則必須指定新的關係或將foreignkeyproperty設置爲不同的NON-NULL值,否則將刪除不相關的對象。

原始消息:

明鏡Vorgang IST fehlgeschlagen:模具Beziehung konnte nicht修訂於werden,噠獻給mindestens EINE DERFremdschlüsseleigenschaftenkeine NULL-Wertezulässig信德。 Wenn eine Beziehunggeändertwird,wird die verwandteFremdschlüsseleigenschaftauf einen NULL-Wert festgelegt。 Wenn derFremdschlüsselkeine NULL-Werteunterstützt,muss eine neue Beziehung definiert,dieFremdschlüsseleigenschafteinem anderen Nicht-NULL-Wert zugeordnet oder das nicht verwandte Objektgelöschtwerden。

當我附加我的對象的關係似乎是intakt,一旦我將狀態更改爲刪除NavigationProperties設置爲NULL,但爲什麼EF試圖改變關係時,我只需要一個簡單的刪除命令?

編輯:

如在下面的意見建議。 我已經將我的表之間的關聯設置爲具有層疊刪除,但由於某些原因它被忽略。

那我協會的樣子:

End1 Multiplicity - 1 (One of TabAdjust) 
End1 Navigation Property - TabAdjustAccounts 
End1 OnDelete - Cascade 
End1 Role Name - TabAdjsut 

End2 Multiplicity - * (collection of TabAdjustAccount) 
End2 Navigation Property - TabAdjust 
End2 OnDelete - None 
End2 Role Name - TabAdjustAccount 
Name - CS_TABADJUSTTABADJUSTACCOUNT 
Referential Contraint - TabAdjust -> TabAdjustAccount 

它是一種1:N的關係TabAdjust和之間 TabAdjustAccount

在我的示例中,我試圖刪除TabAdjust,在將TabAdjustAccounts屬性包含項目之前,將狀態更改爲刪除狀態後,將刪除TabAdjustAccounts導航屬性。

EDIT2:

我使用數據庫第一種方法。

EDIT3:

見我的回答如下也許可以解釋爲什麼這種變化有差別。

+2

這是說,你要刪除一個「父」例如,當一個或多個「子」情況依然存在正式的方式。 – dasblinkenlight

+0

@dasblinkenlight但是,爲什麼改變狀態刪除清除所有引用,如果它不會這樣做,刪除級聯應該踢,但不是這種情況。 –

+0

您是否在EF中啓用了級聯刪除選項? – dasblinkenlight

回答

0

不知道它的錯誤或功能,但是當我在我的代碼從:

public bool Delete() 
{ 
    using (var context = new DbContext()) 
    { 
     context.Set(this.GetType()).Attach(this); 
     context.Entry(this).State = EntityState.Deleted; 

     context.SaveChanges(); 
    } 
} 

要這樣:

public bool Delete() 
{ 
    using (var context = new DbContext()) 
    { 
     context.Set(this.GetType()).Attach(this); 
     context.Set(this.GetType()).Remove(this); // <-- changed line... 

     context.SaveChanges(); 
    } 
} 

一切工作正常,級聯刪除踢成功。

我不會接受這個答案,因爲也許有人知道爲什麼。

0

快速搜索「實體框架忽略級聯刪除」找到this answer到另一個SO question。您可能需要啓用級聯對因表中刪除:

.WillCascadeOnDelete(true);

+0

這對我來說並不合適,因爲我沒有使用代碼優先的方法,也沒有需要調用此方法的流利api。我首先使用DataBase,並有一個EDMX文件,我沒有這個設置的屬性。 –

2

在我自己的項目中,這個問題與oracle有關。在Oracle.ManagedDataAccess 4.1.112.1調用通過「context.Entry(this).State = EntityState.Deleted;」工作正常。

在4.121.2.0更新發生同樣的問題後,級聯刪除不再觸發。

你的方法與「context.Set(this.GetType())。Remove(this);」也適用於我。但是,對於插入和刪除對象神諭正確的方法是:

public bool Delete() 
{ 
    using (var context = new DbContext()) 
    { 
     context.MyEntityType.Remove(this); 
     //context.DeleteObject(this); <- in older versioned context 

     context.SaveChanges(); 
    } 
} 

Oracle Docu: inserting and deleting

相關問題