Tôi đã viết một phương pháp mở rộng để thêm các mục vào (EF) EntityCollection. Tôi đã nhận được một lỗi thú vị, nói rằng bộ sưu tập của tôi về IEnumerable ("mục") đã được sửa đổi, sau vòng lặp đầu tiên trong foreach. Khi tôi chuyển các mục thành items.ToList() (như trong đoạn code dưới đây), nó hoạt động tốt.C# Sửa đổi bí ẩn IEnumerable, cái gì đang sửa đổi IEnumerable của tôi?
Tôi hoàn toàn hiểu rằng việc thực hiện ToList() sẽ tạo ra một bản sao của các mục mà tại đó foreach sẽ hoạt động.
Điều tôi không hiểu là những gì đang sửa đổi IEnumerable khi tôi đang thực hiện một foreach trên nó.
Cập nhật: Bằng cách nào đó, có vẻ như biến mặt hàng giống với biến số sưu tập?
Cập nhật 2: Tôi nghĩ rằng việc thu thập và tổ chức có thể bị ảnh hưởng bởi theo dõi thực thể của EF, nhưng tôi vẫn không hiểu tại sao
Cách sử dụng:
ssp.ServiceAreas.ReplaceCollection(model.ServiceAreas);
Dưới đây là phương pháp khuyến nông của tôi:
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' sửa đổi nó, do đó, hãy thêm. – vcsjones
@vcsjones Mặc dù đó là sự thật, trong tình huống này nó không phải là đơn giản. –
Có phải 'items == collection' trong trường hợp của bạn không? –