【问题标题】:Updating child collection of POCO (adding/updating/deleting) in Entity Framework 4.1在 Entity Framework 4.1 中更新 POCO 的子集合(添加/更新/删除)
【发布时间】:2012-01-25 09:53:57
【问题描述】:

我有一个带有用于编辑某些对象的表单的网页。这个对象包含一个像这样定义的其他对象的集合:

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 循环或先将要删除的对象添加到其他列表来克服这个问题,但我希望也许有一种模式可以让我的代码更好。

提前感谢所有建议。

【问题讨论】:

    标签: vb.net entity-framework-4.1


    【解决方案1】:

    替换...

    For Each item In dbCollection
    

    ...作者:

    For Each item In dbCollection.ToList()
    

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

    【讨论】:

    • 这是解决我的问题的简单可行的方法。是你的还是你在哪里见过?我会等一会儿,看看是否有其他人在这里发布答案。如果没有,我会接受你的。
    • @MichalB.:我自己经常使用它。您会在许多示例中看​​到这一点,这是解决“集合已修改”问题的标准解决方案。这不是我的发明。
    猜你喜欢
    • 2023-04-05
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多