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