(EF)EntityCollectionにアイテムを追加する拡張メソッドを書いた。 IEnumerable( "items")のコレクションがforeach内の最初のループの後に変更されたと言って面白いエラーが発生しました。アイテムをitems.ToList()に変換すると(下のコードのように)、うまく動作します。C#IEnumerableミステリーの修正、私のIEnumerableの変更は何ですか?
ToList()は、foreachが動作するアイテムのコピーを生成することを完全に理解しています。
私が理解できないのは、IEnumerableをforeachしているときにIEnumerableを変更していることです。
更新:どういうわけか、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);
}
これを変更すると「削除」されますので、追加します。 – vcsjones
@vcsjonesこれは本当ですが、この状況ではそれほど単純ではありません。 –
'items == collection'はあなたのケースですか? –