2012-01-25 74 views
1

我有一個用於編輯某個對象的表單的網頁。這個對象包含了這樣的定義的其他對象的集合:更新實體框架中POCO的子集合(添加/更新/刪除)4.1

Public Overridable Property Employees As List(Of Employee)

在一個形式,我可以刪除僱員,添加一個新的或修改現有的一個。當我點擊保存時,新的值被髮送到服務器。在服務器上,我檢查用戶是否存在。如果存在,那麼我修改它的值,如果它不存在,那麼我添加它。所有存在於服務器上且未發送的員工都被標記爲已刪除(狀態已更改爲EntityState.Deleted)。我嘗試使用下面的代碼(dbCollection =數據庫實體,從形式發送newCollection =集合):

For Each item In dbCollection 
     Dim dbItem = item 
     Dim newTask = newCollection.FirstOrDefault(Function(i) i.Id = dbItem.Id) 


     If newTask Is Nothing Then 
      Me.Entry(item).State = EntityState.Deleted 
     Else 
      Me.Entry(item).CurrentValues.SetValues(newTask) 
      newCollection.Remove(newTask) 
     End If 
    Next 

    For Each item In newCollection 
     dbCollection.Add(item) 
    Next 

    Me.SaveChanges() 

此代碼不起作用,因爲改變到EntityState.Deleted去除收集的對象,併爲每個循環休息,因爲集合被修改...

我知道我可以克服這個問題,通過使用for循環或添加對象首先刪除其他列表,但我希望也許有一個模式,將使我的代碼更好。

在此先感謝您的所有建議。

回答

2

替換...

For Each item In dbCollection 

...由:

For Each item In dbCollection.ToList() 

ToList()將創建集(僅引用,而不是對象本身)的副本。 dbCollection.ToList()是另一個集合,而不是dbCollection,因此您可以安全地修改dbCollection而不會在For Each循環中收到「集合已被修改」異常。

+0

這是一個簡單而且可行的解決我的問題的方法。它是你的還是你在某處看到過的?我會等一會兒,看看是否有人在這裏發佈答案。如果不是,我會接受你的。 –

+0

@MichalB:我經常使用它。你會在很多例子中看到這個,這是解決「收集已被修改」問題的標準解決方案。這不是我的發明。 – Slauma