在实体框架4.1中更新POCO的子集合(添加/更新/删除)

时间:2012-01-25 09:53:58

标签: vb.net entity-framework-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循环或首先将删除对象添加到其他列表中来克服此问题,但我希望可能有一种模式可以使我的代码更好。

提前感谢所有建议。

1 个答案:

答案 0 :(得分:2)

替换...

For Each item In dbCollection

...由:

For Each item In dbCollection.ToList()

ToList()将创建集合的副本(仅限引用,而不是对象本身)。 dbCollection.ToList()是另一个集合,而不是dbCollection,因此您可以安全地修改dbCollection,而无需在For Each循环中获取“已修改集合”异常。