我試圖比較2個列表並對數據庫進行適當更改。實體框架。 「刪除和修改列表上的元素時附加」X'類型實體失敗...「錯誤
鑑於OldList
和NewList
我比較兩者並決定應刪除,插入或只是修改哪些元素。
鑑於此兩份名單:
OldList
包含IDS1
,2
和3
NewList
包含IDS1
和3
然後,用ID 2
的項目應被刪除,具有ID 1
和3
的項目應該是改性。
這是我的功能
if (OldList != null && NewList != null) {
// get modifications
var deleted = (from item in OldList where !NewList.Any(c => c.Id == item.Id) select item).ToList();
var modified = (from item in NewList where OldList.Any(c => c.Id == item.Id) select item).ToList();
var added = (from item in NewList where !OldList.Any(c => c.Id == item.Id) select item).ToList();
// change state to added, modified or delete ones
modified.ForEach(item => db.Entry(item).State = EntityState.Modified);
deleted.ForEach(item => db.Entry(item).State = EntityState.Deleted);
added.ForEach(item => db.Entry(item).State = EntityState.Added);
}
當我運行它,然後我得到了執行EntityState.Deleted
線引起EntityState.Modified
已經執行休耕錯誤:
System.InvalidOperationException:連接實體類型'X'失敗,因爲另一個相同類型的實體已經具有相同的主鍵值。如果圖中的任何實體具有衝突的鍵值,則使用「附加」方法或將實體的狀態設置爲「未更改」或「已修改」時可能會發生這種情況。這可能是因爲一些實體是新的並且還沒有收到數據庫生成的關鍵值。在這種情況下,使用'Add'方法或'Added'實體狀態來跟蹤圖形,然後根據情況將非新實體的狀態設置爲'Unchanged'或'Modified'。
其實。真正的問題是。從不同列表(OldList
和NewList
)附着元件
看來,當我從一個列表中添加元素,列表上的所有其他元素連接了。
如何才能比較兩個列表,設置項目狀態並避免此錯誤?
丹尼爾,你需要表現出更多的代碼。你如何保持/更新舊列表和新列表變量。你如何管理你的上下文('db')。 EF使用什麼樣的(如果有的話)代碼生成策略? – vittore