2013-12-17 52 views
0

像標題所說的那樣,EF 6不想刪除表中的行(多對多關係)。實體框架不希望刪除表中存在多對多關係的行

表是:

組織

  • ID(int主鍵)
  • 名稱(字符串)

OrganizationContact(多對多)

  • 標識(int主鍵)
  • OrganizationId(外鍵Organization.Id不爲空)
  • ContactTypeId(外鍵ContactType.Id不爲空)
  • 詳細信息(串)

ContactType

  • Id(int主鍵)
  • 名稱(字符串可爲空)

這是代碼:

using (var db = new Entities()) 
{ 
    db.Database.Log = x => Debug.WriteLine(x); 
    var organizationDto = db.Organizations.First(); 
    var contactDto = organizationDto.Contacts.Last(); 
    organizationDto.Contacts.Remove(contactDto); 
    db.SaveChanges(); 
} 

這是個例外:

「System.InvalidOperationException」類型的異常出現在EntityFramework.dll但在用戶代碼

其他沒有處理信息:操作失敗:由於一個或多個外鍵屬性不可空,因此無法更改關係。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。

我將不勝感激任何建議。謝謝!

編輯: db.SaveChanges()的日誌顯示沒有對數據庫的查詢。

+0

當您刪除「聯繫人」時,是否要刪除級聯?刪除一個'Contact'可能會留下一個'OrginizationContact'行,指向'Contact'中不存在的行。 –

+0

其實,我試圖刪除一個OrginizationContact行,我想只刪除OrganizationContact中的行。 – user3049133

回答

3
using (var db = new FIXEntities()) 
{ 
    db.Database.Log = x => Debug.WriteLine(x); 
    var organizationDto = db.Organizations.First(); 
    var contactDto = organizationDto.Contacts.Last(); 
    //organizationDto.Contacts.Remove(contactDto); // not necessary 

    db.Entry(contactDto).State = EntityState.Deleted; 
    // or, like this if you prefer 
    db.Set<OrganizationContact>().Remove(contactDto); 

    db.SaveChanges(); 
} 

僅僅從集合屬性中刪除它是不夠的,你必須刪除它。由於您的多對多有自己的主鍵,因此EF不知道您希望它被刪除,它只是認爲您希望它被取消關聯。因此,您必須將其刪除才能滿足EF在例外情況下抱怨的FK關係。

+0

謝謝,你是絕對正確的! – user3049133