我已經寫了一個擴展方法來添加項目到(EF)EntityCollection。我收到了一個有趣的錯誤,說我收集的IEnumerable(「items」)在foreach的第一個循環之後被修改了。當我將項目變成items.ToList()(如下面的代碼)時,它工作正常。C#修改IEnumerable之謎,什麼是修改我的IEnumerable?
我完全理解做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 2012-01-09 14:10:07
@vcsjones雖然這是事實,但在這種情況下並不那麼簡單。 – 2012-01-09 14:12:58
你的情況是'items == collection'嗎? – 2012-01-09 14:26:53