循环添加记录引发异常

时间:2013-07-15 10:56:38

标签: asp.net-mvc entity-framework

有谁知道使用循环添加记录的正确方法是什么?

我有一个处理库存的系统,目前我需要能够批量创建库存,因为创建具有不同ID的50-100个相同的项目将是乏味的。我所做的是创建一个基本上需要 StartID 和一个 EndID 和一个基础库存类,并在控制器循环中通过这两个ID之间的差异并创建一个记录

ViewModel不是问题,并且传输数据就好了:

public class MassCreateInventoryViewModel
{
    public Inventory InventoryBase { get; set; }
    public int StartID { get; set; }
    public int EndID { get; set; }
    public IEnumerable<SelectListItem> Products { get; set; }
}

我在某处读到db.SaveChanges()应该在循环之外,因为它应该只被调用一次:

    for (int inventoryID = viewModel.StartID; inventoryID <= viewModel.EndID; inventoryID++)
                {
                    Inventory newInventory = new Inventory
                        {
                            InventoryID = inventoryID,
                            ProductID = viewModel.InventoryBase.ProductID,
                            DateEdited = DateTime.Now,
                            EditedByUserID = WebSecurity.CurrentUserId,
                            CustomProperties = viewModel.InventoryBase.CustomProperties
                        };

                    Database.Inventories.Add(newInventory);

                    if (newInventory.CustomProperties != null && newInventory.CustomProperties.Any())
                    {
                        foreach (CustomDataType dt in newInventory.CustomProperties.Select(x => x.DataType).ToList())
                        {
                            Database.Entry(dt).State = EntityState.Unchanged;
                        }
                    }

                }
                Database.SaveChanges();
        }

但是当我尝试循环时,它会存储第一条记录,然后抛出Collection was modified; enumeration operation may not execute.异常。当我在Database.SaveChanges()方法之后添加Add时,会引发A The property 'InventoryID' is part of the object's key information and cannot be modified.错误。

清单ID是此表中的Key,但已设置为我可以输入自己的ID。

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Display(Name = "Inventory ID")]
public new int InventoryID { get; set; }

自定义属性分为两个模型,第一个是基类。

public class CustomProperty
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CustomPropertyID { get; set; }

    public int CustomDataTypeID { get; set; }
    [ForeignKey("CustomDataTypeID")]
    public CustomDataType DataType { get; set; }

    public string PropertyValue { get; set; }
}

,第二个是映射到数据库的模型:

[Table("CustomInventoryProperty")]
public  class CustomInventoryProperty : CustomProperty
{
    public int InventoryID { get; set; }
    [ForeignKey("InventoryID")]
    public virtual Inventory Inventory { get; set; }
}

1 个答案:

答案 0 :(得分:1)

用以下代码取代你的for循环:

var dateEdited = DateTime.Now;
for (int inventoryID = viewModel.StartID; inventoryID <= viewModel.EndID; inventoryID++)
{
    Inventory newInventory = new Inventory
    {
        InventoryID = inventoryID, 
        ProductID = viewModel.InventoryBase.ProductID,
        DateEdited = dateEdited,
        EditedByUserID = WebSecurity.CurrentUserId
    };

    if(viewModel.InventoryBase.CustomProperties != null)  
    {
        newInventory.CustomProperties = new List<CustomProperties>(); 
        foreach(var customProperty in viewModel.InventoryBase.CustomProperties)
        {
           newInventory.CustomProperties.Add(customProperty);
        }
    }

    Database.Inventories.Add(newInventory);
    Database.SaveChanges();
}