Asp.net mvc 循环添加记录引发异常

Asp.net mvc 循环添加记录引发异常,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,有人知道使用循环添加记录的正确方法吗 我有一个处理库存的系统,目前我需要能够批量创建库存,因为创建50-100个具有不同ID的相同项目会很乏味,我所做的是创建一个MassCreate viewmodel,它基本上采用一个StartID和一个EndID以及一个基本库存类,并通过这两个ID之间的差异在控制器循环中创建一个记录 ViewModel不是一个问题,它可以很好地传递数据: public class MassCreateInventoryViewModel { public Inven

有人知道使用循环添加记录的正确方法吗

我有一个处理库存的系统,目前我需要能够批量创建库存,因为创建50-100个具有不同ID的相同项目会很乏味,我所做的是创建一个MassCreate viewmodel,它基本上采用一个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; }
}
但是当我尝试循环时,它会很好地存储第一条记录,然后抛出一个
集合被修改;枚举操作可能无法执行。
异常。当我在
Add
方法之后包含
Database.SaveChanges()
时,它抛出一个
属性“InventoryID”是对象关键信息的一部分,不能修改。
错误

InventoryID是此表中的
,但已设置为可以输入自己的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; }
}

将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();
}
var dateEdited=DateTime.Now;

对于(int inventoryID=viewModel.StartID;inventoryID),您在检查是否存在CustomProperties的if子句中尝试执行什么操作?您应该放置
Database.SaveChanges()
当然在循环之外。检查是因为我有一个外键指向用户定义的自定义数据表CustomTypes,还有一个CustomInventoryProperties表来存储它们的输入,循环是为了确保CustomTypes不会被修改,因为我遇到了一个问题,即每次创建新库存项目时,它都会复制n CustomTypes。你能解释一下你的数据库中有哪些表,为什么吗?看起来你的数据模型没有规范化。那么,为什么你的代码中缺少CustomerId?CustomerId是一个可空字段,因为不是每个库存项目都与客户相关联。从技术上讲,我不应该把它放在那里,但它用于测试一些我不明白这是什么意思?InventoryBase.CustomProperties已经是一个集合,你基本上是将集合分解并重新添加?是的,将该列表中的每一项都视为数据库表中的一个新记录。它们都必须有一个新的主键,并且还应该有e是一个InventoryId。事实上,上面的代码也不起作用。CustomPropertyId是一个自动生成的id吗?是的,PropertyID是自动生成的。我已经将模型添加到我的问题中了。不管怎样,你的回答都解决了我的问题,我完全忘记了使用相同的
CustomProperties
不会将其创建为新的customProperty。谢谢!
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();
}