2012-11-28 48 views
1

我有代碼第一個實體框架。
當我試圖刪除表中有外鍵到其他表的行我得到一個異常。異常處理後,當我嘗試加載我的數據再次證明我試圖刪除所選項目的導航鍵是成爲試圖刪除後導航鍵丟失

爲什麼出現這種情況,如何解決它。

刪除過程是如此的簡單:

public class Person 
{ 
    public int ID {get;set;} 
    public string Name {get;set;} 

    public Something Something {get;set;} 
    public ICollection<Profile> Profile {get;set;} 
} 

try 
{ 
    var p = en.Person.First(t => t.ID == 14); 
    //p.Something here is not null; 
    en.Remove(p) 
    en.SaveChanges(); // I'm get an exception here 
} 
catch { /*error handling */} 
finally 
{ 
    var p = en.Person.First(t => t.ID == 14); 
    //but p.Something here is null; 
} 

en.SaveChange()我得到一個異常。

DELETE語句衝突與外鍵約束 「FK_person_profile

這是我班的一個示例。
東西屬性是一個導航鍵。 在第一選擇東西有價值 但在第二次選擇裏面終於阻止它成爲空

修復了刪除問題之後,現在我在將對象添加到數據庫後遇到同樣的問題。 並且重裝功能不起作用。
有什麼建議嗎?

+0

您可以發佈您的代碼?你的刪除函數和拋出錯誤的方法會很有幫助! –

+0

@MarkOreta:更新問題 – Raika

+3

你的錯誤是因爲有一個**必需的** FK關係,它沒有設置爲級聯刪除(它看起來像你有一個配置文件對象)。您需要將關係設爲可選,刪除配置文件或啓用級聯刪除。 –

回答

2

我想我理解你的問題 - 你正在刪除一個實體,它導致了一個錯誤,你想恢復。但是,當你再次從當前上下文中獲取實體時,最終會阻止它,這是不正確的。

問題是,您期待您的上下文從數據庫中重新加載,但這並不完全如此。你實際上做的是回到你的上下文中,這是一個工作單元,並在內存中檢索實體,因爲你檢索的實體被標記爲刪除,所以它的屬性沒有被加載。如果要從數據庫刷新,則需要使用Entry完全重新加載實體,使用DbEntityEntry.Reload

使用你的代碼的一個例子:

var p = en.Person.First(t => t.ID == 14); 
en.Entry(p).Reload();