c# - `Collection was modified; enumeration operation may not execute` error while reading data -
we have web-application , uses entity framework access data (db oracle). we've moved ef6 recently. use transactions in following way:
- we create transaction, have
entitytransaction
object ,entityconnection
object now. - several concurrent requests done db. each request runs in own thread (actually requests come client). each request own
objectcontext
created using sameentityconnection
object. requests of transaction run in parallel partially, in given moment of time there few parallel running requests.
and under these conditions strange error started occur: exception - collection modified; enumeration operation may not execute
.
it happens when data read or updated, , when connection property of entitytransaction accessed.
the beginning of stack trace may vary, end same:
system.invalidoperationexception: collection modified; enumeration operation may not execute. @ system.collections.generic.list
1.enumerator.movenextrare() @ system.linq.enumerable.whereselectlistiterator
2.movenext() @ system.linq.enumerable.d__142.movenext() @ system.linq.enumerable.<distinctiterator>d__81
1.movenext() @ system.linq.enumerable.whereenumerableiterator1.movenext() @ system.collections.generic.list
1..ctor(ienumerable1 collection) @ system.linq.enumerable.tolist[tsource](ienumerable
1 source) @ system.data.entity.infrastructure.interception.dbinterceptioncontext..ctor(ienumerable`1 copyfrom) @ system.data.entity.core.entityclient.entitytransaction.get_interceptioncontext()
actually there variant end of stack trace (but can see equivalent):
system.invalidoperationexception: collection modified; enumeration operation may not execute. @ system.collections.generic.list
1.enumerator.movenextrare() @ system.linq.enumerable.whereselectlistiterator
2.movenext() @ system.linq.enumerable.any[tsource](ienumerable1 source, func
2 predicate) @ system.data.entity.infrastructure.interception.dbinterceptioncontext..ctor(ienumerable`1 copyfrom) @ system.data.entity.core.entityclient.entityconnection.get_interceptioncontext()
as can see, error occurs in dbinterceptioncontext
constructor. it's kind of ef internals , collection (which modified) internal collection , has no direct link our custom code.
few notes:
- we didn't have such error prior ef6 update.
- error happens relatively rare, 1% of transactions.
what reason error? issue ef6? or using ef in wrong way? allowed create several objectcontext
-s 1 connection supposed run concurrently?
if needed can provide examples of complete call stacks.
this problem happens if add/remove collection while iterating on it:
// throws "collection modified" error foreach (var item in mycollection) { mycollection.remove(item); } // fix problem, iterate on copy of collection count not change var fixedsize = mycollection.toarray(); foreach (var item in fixedsize) { mycollection.remove(item); }
maybe old code returned arrays, whereas ef 6 code returns ienumerable? should check create/update/delete usecases problem.
Comments
Post a Comment