ループを使用してレコードを追加する適切な方法を知っている人はいますか?
私は在庫を処理するシステムを持っています。現在、異なる ID を持つ 50 ~ 100 個の同一のアイテムを作成するのは面倒なので、在庫を一括作成できるようにする必要があります。ベース インベントリ クラスとコントローラ ループでこれら 2 つの 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
がスローされThe property 'InventoryID' is part of the object's key information and cannot be modified.
ます。
InventoryID はKey
この表にありますが、自分の ID を入力できるように設定されています。
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Display(Name = "Inventory ID")]
public new int InventoryID { get; set; }
カスタム プロパティは 2 つのモデルに分割されます。最初のモデルは基本クラスです。
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; }
}
2 つ目は、データベースにマップされたモデルです。
[Table("CustomInventoryProperty")]
public class CustomInventoryProperty : CustomProperty
{
public int InventoryID { get; set; }
[ForeignKey("InventoryID")]
public virtual Inventory Inventory { get; set; }
}