实体框架集合已被修改;枚举操作可能无法执行

时间:2012-02-23 01:59:40

标签: c# entity-framework

我目前正在使用EF 4.0。我的目标是删除子集合并将新的集合添加到同一父集合。

 public void AddKids(int parentId, Kids newKids)
 {
    using (ModelContainer context = new ModelContainer(connectionString))
    {
        using (TransactionScope scope = new TransactionScope())
        {
            var query = from Parent _parent in context.Parents
                        where _parent.ParentId == parentId select _parent;

            Parent parent = query.Single();
            while (parent.Kids.Any())
            {
                context.Kids.DeleteObject(parent.Kids.First());
            }

            if (newKids != null)
            {
                foreach (Kid _kid in newKids)
                {
                    parent.Kids.Add(new Kid
                    {
                        Age = _kid.Age,
                        Height = _kid.Height
                    });
                }
            }
            scope.Complete();
        }
        context.SaveChanges(); //Error happens here
    }
}

错误来自标题:收集已修改;枚举操作可能无法执行。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:45)

您看到了这一点,因为您从当前具有活动操作的集合中删除了对象。更具体地说,您正在更新Kids集合,然后在while循环中对其执行Any()运算符。使用IEnumerable实例时,这不是受支持的操作。我建议你做的是重写你的时间:

parent.Kids.ToList().ForEach(r => context.Kids.DeleteObject(r));

我希望有所帮助。

答案 1 :(得分:-1)

我遇到了同样的问题/错误。 ruffin的解决方案起作用了。

这会崩溃:

var objectsToRemove = employee.Contracts.Where(m => ...);
objectsToRemove.ForEach(m => _context.Contracts.Remove(m));

这对我有用:

var objectsToRemove = employee.Contracts.Where(m => ...).ToList();
objectsToRemove.ForEach(m => _context.Contracts.Remove(m));