2017-02-21 26 views
0

我試圖比較2個列表並對數據庫進行適當更改。實體框架。 「刪除和修改列表上的元素時附加」X'類型實體失敗...「錯誤

鑑於OldListNewList我比較兩者並決定應刪除,插入或只是修改哪些元素。

鑑於此兩份名單:

  • OldList包含IDS 123
  • NewList包含IDS 13

然後,用ID 2的項目應被刪除,具有ID 13的項目應該是改性。

這是我的功能

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'。

其實。真正的問題是。從不同列表(OldListNewList)附着元件

看來,當我從一個列表中添加元素,列表上的所有其他元素連接了。

如何才能比較兩個列表,設置項目狀態並避免此錯誤?

+0

丹尼爾,你需要表現出更多的代碼。你如何保持/更新舊列表和新列表變量。你如何管理你的上下文('db')。 EF使用什麼樣的(如果有的話)代碼生成策略? – vittore

回答

1

我的朋友。你可以在LinQ中使用Intersect和Except Operator。

var lstModified = OldList.Intersect(NewList); //return 1, 3 

var lstDeleted = OldList.Except(NewList); //return 2 

您可以訪問這個鏈接引用更多: https://code.msdn.microsoft.com/LINQ-Set-Operators-374f34fe

+0

感謝您的建議,但它不起作用,因爲列表中的項目不是同一個對象。唯一的共同點是ID。無論如何,我應該使用ID比較器。 –