我一直收到此错误:Collection was modified; enumeration operation may not execute
protected void SendAddedMessages(IEnumerable<int> receiverIds, Result result)
{
foreach (var receiverId in receiverIds)
{
SendAddMessage(receiverId, result);
}
}
我明白这意味着什么,但问题是,你可以看到我没有在任何地方修改它,我的功能调用是SendAddedMessages(result.People.Select(r => r.Id), result);
我想我可以把它作为一个数组投射而只是使用for循环,但我想知道它在哪里/为什么它被修改。这是一个MVC应用程序,我使用EntityFramework,是否还有另一个线程可以做到这一点?
更新1添加了SendAddMessage
protected void SendAddMessage(int recevierId, Result result)
{
Messaging.SendMessage(
recevierId,
"Some text",
String.Format(CommonString.AddedToResult, result.Name, Name)
);
}
答案 0 :(得分:2)
我唯一能想到的是,在发送邮件的(可能相对冗长的)过程中,数据库表的内容会发生变化。在枚举集合时,db读取器正在读取,在EF6之前,默认情况下,此读取不是来自快照。请参阅Entity Framework 6: The Ninja Edition,查找READ_COMMITTED_SNAPSHOT
。
这就是为什么在实际执行查询时控制并快速执行查询的好方法。就个人而言,我更喜欢像ICollection<int> receiverIds
这样的论点,所以我知道我收到了一个枚举的集合,而不是一个懒惰的装弹。
修改强>
在您的最终评论之后,保存与People
相关的对象可能会导致集合在EF的机器中进行更深层次的修改,因为EF也会运行DetectChanges
,这可能会触及现有的关联。