2012-01-25 12 views
1

私はあるオブジェクトを編集するためのフォームを持つWebページを持っています。私は新しいものを追加したり、既存のものを修正し、従業員を削除することができますフォームのEntity Framework 4.1でPOCO(追加/更新/削除)の子コレクションを更新する

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以外のコレクションであり、For Eachループで「コレクションが変更されました」例外が発生することなくdbCollectionを安全に変更できるようになりました。

+0

これは私の問題の簡単かつ実現可能な解決策です。それはあなたのものか、どこかで見たことがありますか?私はしばらく待って、他の誰かがここに答えを投稿するかどうかを見ます。そうでなければ私はあなたを受け入れます。 –

+0

@MichalB:私は非常に頻繁にそれを使用しています。多くの例でこれを見ることができます。これは、「コレクションが修正されました」という問題を解決するための標準的な解決策のようなものです。私の発明ではありません。 – Slauma

関連する問題