【问题标题】:Collection was modified; enumeration operation may not execute. EF Core 2.2收藏已修改;枚举操作可能无法执行。 EF 核心 2.2
【发布时间】:2020-02-09 23:23:46
【问题描述】:

我需要一些帮助来解决这个问题,我使用的是 EF Core 2.2 和 ASP.Net Core 2.2

我正在尝试从我的实体(用户)中删除一些电话,但是在执行 dbcontext.SaveChanges() 时会生成异常:集合已修改;枚举操作可能无法执行。

我的用户服务

User entity = _userRepository.GetById(model.Id);

var numbers = GetDeletePhoneNumbers(model, entity.UserPhones.ToList());

foreach (var number in numbers)
{                
   entity.RemoveUserPhones(_userPhoneRepository.GetByPhoneNumber(number));

   _userRepository.Modify(entity);
}

我获取删除手机的方法

 private List<string> GetDeletePhoneNumbers(UserModel model, List<UserPhone> userPhones)
 {
    return userPhones.Where(c => !model.Phones.Any(u => u.Number == c.Phone.Number)).Select(c => c.Phone.Number).ToList();
 }

还有我的 RepositoryClass

protected override void InternalModify(TEntity entity)
{           
    this._dbContext.Set<TEntity>().Update(entity);
    _dbContext.SaveChanges();           
}

我的异常堆栈跟踪

System.ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion() 在 System.Collections.Generic.Dictionary2.ValueCollection.Enumerator.MoveNext() at System.Linq.Enumerable.ConcatIterator1.MoveNext() 在 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()

求帮助...

【问题讨论】:

  • “RemoveUserPhones”有什么作用?除此之外——你每次迭代都省钱吗?为什么不在 foreach 之后保存?
  • 嗨,“RemoveUserPhone”仅从实体列表中删除电话。我试图在 foreach 之后保存,但不工作 public virtual void RemoveUserPhones(UserPhone userPhone) { if (_userPhones.Contains(userPhone)) { _userPhones.Remove(userPhone); } }
  • 尝试在迭代后保存 - 否则您将处理一个不再是数据库实际状态的集合

标签: c# asp.net-core-2.2 ef-core-2.2 ddd-repositories


【解决方案1】:

问题是foreach 循环假定一个不可变的集合来迭代它。也就是说,在循环发生时不能修改集合;换句话说,循环开始时的集合在整个循环执行过程中必须保持不变。

因此,在循环发生时修改集合的状态会导致抛出异常。这与EF无关,是foreach循环的特性。

【讨论】:

  • 是的,我认为问题出在 foreach 上,但我尝试了另一种方法,但问题仍然存在......
  • @jmoyau 你说你尝试了另一种方法是什么意思?发布更多代码。
猜你喜欢
  • 2012-04-01
相关资源
最近更新 更多