Обновление дочерней коллекции POCO (добавление / обновление / удаление) в Entity Framework 4.1 - PullRequest
1 голос
/ 25 января 2012

У меня есть веб-страница с формой, которая используется для редактирования какого-либо объекта. Этот объект содержит коллекцию других объектов, определенных следующим образом:

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 Ответ

2 голосов
/ 26 января 2012

Заменить ...

For Each item In dbCollection

... на:

For Each item In dbCollection.ToList()

ToList() создаст копию коллекции (только ссылки, а не сами объекты),dbCollection.ToList() - это другая коллекция, отличная от dbCollection, поэтому вы можете безопасно изменять dbCollection, не получая исключение «коллекция была изменена» в цикле For Each.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...