0

ループを使用してレコードを追加する適切な方法を知っている人はいますか?

私は在庫を処理するシステムを持っています。現在、異なる 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; }
}
4

1 に答える 1