我有一个网页,其中包含用于编辑某个对象的表单。此对象包含如下定义的其他对象的集合:
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循环或首先将删除对象添加到其他列表中来克服此问题,但我希望可能有一种模式可以使我的代码更好。
提前感谢所有建议。
答案 0 :(得分:2)
替换...
For Each item In dbCollection
...由:
For Each item In dbCollection.ToList()
ToList()
将创建集合的副本(仅限引用,而不是对象本身)。 dbCollection.ToList()
是另一个集合,而不是dbCollection
,因此您可以安全地修改dbCollection
,而无需在For Each
循环中获取“已修改集合”异常。