收集被修改错误

本文关键字:错误 修改 | 更新日期: 2023-09-27 17:52:45

我有一个问题,删除一个对象,因为它与其他对象的关系。我正在使用MVC4和代码第一数据库方法。

这是我的模型类:

 public class Product
{
    public Product() { }
    public int Id { get; set; } 
    public string Name { get; set; }
    public decimal Price { get; set; }
    public bool Istaxable { get; set; }
    public string DefaultImage { get; set; }
    public IList<Feature> Features { get; set; }
    public IList<Descriptor> Descriptors { get; set; }
    public IList<Category> Categories { get; set; }
    public IList<Image> Images { get; set; }
    public Product(string name, decimal price, bool istaxable, string defaultImageFile)
    {
        Name = name;
        Price = price;
        Istaxable = istaxable;
        DefaultImage = defaultImageFile;
        Categories = new List<Category>();
        Features = new List<Feature>();
        Descriptors = new List<Descriptor>();
        Images = new List<Image>();
    }
}
 public class Image
{
    public Image() { }
    public Image(string thumb, string full) : this(thumb, full, false) { }
    public Image(string thumb, string full, bool isDefault)
    {
        Thumb = thumb;
        IsDefault = isDefault;
        Full = full;
    }
    public int Id { get; set; }
    public string Thumb { get; set; }
    public string Full { get; set; }
    public bool IsDefault { get; set; }
    public string Description { get; set; }
}

下面是我的Product Controller中的代码:

// DELETE /api/product/5
    public HttpResponseMessage Delete(int id)
    {
        var prd = Uow.Products.GetProductByIdIncludeAll(id);
        var images = prd.Images;
        if ( images.Count > 0 )
        {
            foreach(Image i in images)
            {
                Uow.Images.Delete(i);
            }
        }
        var descriptors = prd.Descriptors;
        if (descriptors.Count > 0)
        {
            foreach (Descriptor d in descriptors)
            {
                Uow.Descriptors.Delete(d);
            }
        }
        var features = prd.Features;
        if (features.Count > 0)
        {
            foreach (Feature f in features)
            {
                Uow.Features.Delete(f);
            }
        }
        Uow.Commit();
        Uow.Products.Delete(id);
        Uow.Commit();
        return new HttpResponseMessage(HttpStatusCode.NoContent);
    }    

现在是一个我的Repository类的结构作为一个工作单元。

当我试图运行应用程序时,它删除了关系对象,但没有删除产品对象,因为它说Collection已被修改。

我应该如何重构这段代码使其工作É

收集被修改错误

当您使用foreach时,您不能更改底层集合,我建议您使用基本的for语句。

from above MSDN link:

foreach语句用于遍历集合以获取所需的信息,但不能用于从源集合中添加或删除项,以避免不可预测的副作用。如果需要从源集合中添加或删除项,请使用for循环