收集被修改;枚举操作不能执行MVC



我一直得到这个错误: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,这可能会触及现有的关联。

相关内容

  • 没有找到相关文章

最新更新