【发布时间】:2012-01-09 14:07:54
【问题描述】:
我编写了一个扩展方法来将项目添加到 (EF) EntityCollection。我收到了一个有趣的错误,说我的 IEnumerable(“项目”)集合在 foreach 中的第一个循环之后被修改了。当我将项目转换为 items.ToList() 时(如下面的代码),它工作正常。
我完全明白,执行 ToList() 将生成 foreach 将在其上运行的项目的副本。
我不明白的是,当我对 IEnumerable 进行 foreach 时,是什么在修改它。
更新:不知何故,items 变量似乎与 collections 变量相同?
更新 2:我认为集合和实体可能会受到 EF 的实体跟踪的影响,但我仍然不明白为什么
用法:
ssp.ServiceAreas.ReplaceCollection(model.ServiceAreas);
这是我的扩展方法:
public static void AddOrUpdate<TEntity>(this EntityCollection<TEntity> collection, IEnumerable<TEntity> items)
where TEntity : EntityObject, IProjectIdentity<int>, new()
{
foreach (var item in items.ToList())
collection.AddOrUpdate(item);
}
public static void AddOrUpdate<TEntity>(this EntityCollection<TEntity> collection, TEntity item)
where TEntity : EntityObject, IProjectIdentity<int>, new()
{
if (item.ID > 0 && collection.Any(c => c.ID == item.ID))
collection.Remove(collection.First(c => c.ID == item.ID));
// For now, the Remove NEVER gets hit
collection.Add(item);
}
【问题讨论】:
-
Remove修改它,所以添加。 -
@vcsjones 虽然这是真的,但在这种情况下,事情并不是那么简单。
-
你的情况是
items == collection吗? -
您正在从您正在 foreach-ing 的集合中添加/删除项目(第一个方法为 foreach 块中的每个项目调用第二个,第二个是添加/删除东西)。
-
第一:“items”和“collection”有什么区别?第二:删除实际上永远不会被击中,我会更新帖子。
标签: c# extension-methods ienumerable