昨天更新系统后,上午物流的同事反馈打印出库单时出现这个异常错误。Collection was modified; enumeration operation may not execute.
[InvalidOperationException: Collection was modified; enumeration operation may not execute.]
System.Collections.Generic.Enumerator.MoveNextRare() +12647947
System.Data.Objects.ObjectStateManager.PerformAdd(IList`1 entries) +1204
System.Data.Objects.ObjectStateManager.DetectChanges() +244
System.Data.Entity.Internal.Linq.InternalSet`1.Find(Object[] keyValues) +53
我们的系统是数据库访问采用的是EF4.1框架,对数据库的常用访问接口做了简单的封装,通过Find来获取单条信息。同样的代码在此系统的很多地方使用都没有问题,在开发环境下运行这个功能也没有错误提示,只有在生产环境下才会出现。
开始排查这部分代码和其他使用这个方法的代码有什么不同,对比后也没有发现差异。突然间想起之前听同事说实体双向引用时,在序列化时会报异常信息,拿着部分代码是不是因为双向引用引起的呢?看了同事的实体代码,确实存在着ClassA中有个属性是ClassB,ClassB中有一个属性是ClassA。移除了ClassB中的ClassA和配置的外键关系,更新到生产环境后问题得以解决。
后来又Google了这个问题,发现在http://stackoverflow.com/questions/7536459/ef-4-1-and-collection-was-modified-enumeration-operation-may-not-execute-exc 有详细的解答。