質問: 私たちにはWebアプリケーションがあり、Entityフレームワークを使用してデータにアクセスします(dbはOracleです)。私たちは最近EF6に移りました。我々は以下の方法で取引を使用します: 1. トランザクションを作成するので、 `EntityTransaction`オブジェクトと`EntityConnection`オブジェクトが作成されます。 2. 複数の同時要求がDBに対して行われます。各要求は独自のスレッドで実行されます(実際にはクライアントから要求が送信されます)。要求ごとに、独自の`ObjectContext`が同じ`EntityConnection`オブジェクトを使用して作成されます。トランザクションの要求は部分的に並列に実行されるため、特定の瞬間には並列実行要求はほとんどありません。 そして、これらの条件下で、奇妙なエラーが発生し始めました。例外 - `Collection was modified; enumeration operation may not execute`ます。 データが読み込まれたり更新されたり、EntityTransactionのConnectionプロパティにアクセスされた場合でも発生します。 スタックトレースの開始は変わるかもしれませんが、終わりは常に同じです: > System.InvalidOperationException:コレクションが変更されました。列挙操作が実行されないことがあります。 System.Collections.Generic.Listで`1.Enumerator.MoveNextRare() at System.Linq.Enumerable.WhereSelectListIterator` System.Linq.Enumerable.d__14で2.MoveNext() `2.MoveNext() at System.Linq.Enumerable.d__81` 1. System.Linq.Enumerable.WhereEnumerableIteratorの`1.MoveNext() at System.Collections.Generic.List` 1.MoveNext( `1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable` IEnumerable `1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable` 1 source)System.Data.Entity.Core.EntityClient.EntityTransaction.get_InterceptionContext()でSystem.Data.Entity.Infrastructure.Interception.DbInterceptionContext..ctor(IEnumerable`1 copyFrom) > > 実際にスタックトレースの終わりには別のバリエーションがあります(しかし、それらは基本的に同じです)。 > System.InvalidOperationException:コレクションが変更されました。列挙操作が実行されないことがあります。 System.Collections.Generic.Listの`1.Enumerator.MoveNextRare() at System.Linq.Enumerable.WhereSelectListIterator` 2.MoveNext()System.Linq.Enumerable.Any [TSource](IEnumerable `1 source, Func` 2述語)システム.Data.Entity.Infrastructure.Interception.DbInterceptionContext..ctor(IEnumerable`1 copyFrom)at System.Data.Entity.Core.EntityClient.EntityConnection.get_InterceptionContext() > > これから分かるように、 `DbInterceptionContext`コンストラクタでエラーが発生します。これはEF内部の一種であり、コレクション(変更される)は内部コレクションであり、カスタムコードへの直接リンクはありません。 いくつかのメモ: * EF6を更新する前に、このようなエラーは発生していませんでした。 * エラーは比較的稀で、約1%のトランザクションが発生します。 このエラーの原因は何ですか?それはEF6の問題ですか?または、EFを間違った方法で使用していますか?同時に実行するはずの1つの接続に対して複数の`ObjectContext`を作成することは許可されていますか? 必要な場合は、完全なコールスタックのいくつかの例を提供することができます。
回答: この問題は、反復処理中にコレクションに追加/削除すると発生します。 ``` // throws "collection was modified" error foreach (var item in myCollection) { myCollection.Remove(item); } // to fix this problem, iterate over a copy of the collection whose count does not change var fixedSize = myCollection.ToArray(); foreach (var item in fixedSize) { myCollection.Remove(item); } ``` EF 6コードがIEnumerableを返すのに対し、古いコードが配列を返したのでしょうか?この問題については、作成/更新/削除の使用状況を確認する必要があります。