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

时间:2014-03-18 21:34:08

标签: asp.net asp.net-mvc linq entity-framework

我一直收到此错误: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)
        );
}

1 个答案:

答案 0 :(得分:2)

我唯一能想到的是,在发送邮件的(可能相对冗长的)过程中,数据库表的内容会发生变化。在枚举集合时,db读取器正在读取,在EF6之前,默认情况下,此读取不是来自快照。请参阅Entity Framework 6: The Ninja Edition,查找READ_COMMITTED_SNAPSHOT

这就是为什么在实际执行查询时控制并快速执行查询的好方法。就个人而言,我更喜欢像ICollection<int> receiverIds这样的论点,所以我知道我收到了一个枚举的集合,而不是一个懒惰的装弹。

修改
在您的最终评论之后,保存与People相关的对象可能会导致集合在EF的机器中进行更深层次的修改,因为EF也会运行DetectChanges,这可能会触及现有的关联。