我一直得到这个错误: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)
);
}
我唯一能想到的是,在发送邮件的过程中(可能相对较长)数据库表的内容发生了变化。当集合被枚举时,数据库读取器正在读取,在EF6之前,默认情况下,读取不是来自快照。参见实体框架6:忍者版,寻找READ_COMMITTED_SNAPSHOT
。
这就是为什么控制查询何时实际执行并快速执行它总是好的做法。就我个人而言,我更喜欢ICollection<int> receiverIds
这样的参数,这样我就知道我接收到一个枚举集合,而不是一个惰性加载炸弹。
编辑
在你最后的评论之后,保存与People
相关的对象可能会导致集合在EF的机器中进行更深入的修改,因为EF也会运行DetectChanges
,这可能会触及现有的关联。