2016-03-25 174 views
4

我有一個從數據庫中移除項目的一個問題,如果一個多將它們連接到多關係如何在實體框架刪除許多一對多的關係,6

我的數據庫看起來像

| [Project] | <-- | [JobInProject] | --> | [Job] | 
=============  ==================  ========= 
| ProjectID |  | JobInProjectID |  | JobID | 
|   |  | ProjectID  |  |  | 
|   |  | JobID   |  |  | 

ProjectJob表的主鍵也設置爲其他表的外鍵,但我想是因爲當我從Job表中刪除的項目,它是正確與所有相關的項目在其他表中刪除這不是問題

Project project = await db.Projects.FindAsync(id); 
db.Entry(project).State = EntityState.Deleted; 
await db.SaveChangesAsync(); 

代碼刪除項目項刪除:個所有外鍵被約束,對級聯更新

編碼刪除級聯,我用它來刪除作業項

Job job = await db.Jobs.FindAsync(id); 
db.Entry(job).State = EntityState.Deleted; 
await db.SaveChangesAsync();  

和項目設置只有來自Project表的數據和JobInProject表中的數據不會刪除Job及相關項目。

當我修改代碼以刪除Project這樣的:

Project project = await db.Projects.FindAsync(id); 

foreach (var item in project.JobInProjects) 
{ 
    db.Entry(item.Job).State = EntityState.Deleted; 
} 

db.Entry(project).State = EntityState.Deleted; 
await db.SaveChangesAsync(); 

我上await db.SaveChangesAsync();

錯誤操作失敗:關係不能因爲一個或多個的改變外鍵屬性是不可空的。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。

如何刪除Project項目及相關項目Job項目?

我會很感激的幫助

+0

'Project和Job表中的主鍵也被設置爲其他表中的外鍵,您怎麼能夠在多對多關係中有一個*外鍵給另一個實體?這意味着你有一對一的關係 –

回答

2

這是因爲你不標記JobInProject對象Deleted

foreach (var item in project.JobInProjects) 
{ 
    db.Entry(item.Job).State = EntityState.Deleted; 
    db.Entry(item).State = EntityState.Deleted; // <= line added 
} 

如果你不這樣做,EF會假設你不想要刪除該項目並嘗試設置JobInProjectnull這兩個外鍵,但當然一個或多個外鍵屬性是不可空的(都不)。