2

私のコントローラーでは、アイテムをループしてデータベースに保存しています。問題は、最初のアイテムは保存されますが、他のアイテムは保存されないことです。ループの「SaveItem()」行にブレークポイントを設定すると、毎回ヒットしますが、最初のアイテムのメソッドにしか通過しないのが奇妙に思えます。

私は何を間違っていますか?

public void SubmitItem(Cart cart, ShippingDetails shippingDetails, ProcessedItems processedItem, string orderID)
{
    var cartItems = cart.Lines;
    //CartIndexViewModel cartIndex = new CartIndexViewModel();
    //var customID = cartIndex.OrderID;

    foreach(var item in cartItems)
    {
        processedItem.OrderID = orderID;
        processedItem.ProductID = item.Product.ProductID;
        processedItem.Name = item.Product.Name;
        processedItem.Description = item.Product.Description;
        processedItem.Price = item.Product.Price;
        processedItem.Category = item.Product.Category;
        processedItem.ImageName = item.Product.ImageName;
        processedItem.Image2Name = item.Product.Image2Name;
        processedItem.Image3Name = item.Product.Image3Name;

        processedItem.BuyerName = shippingDetails.Name;
        processedItem.Line1 = shippingDetails.Line1;
        processedItem.Line2 = shippingDetails.Line2;
        processedItem.Line3 = shippingDetails.Line3;
        processedItem.City = shippingDetails.City;
        processedItem.State = shippingDetails.State;
        processedItem.Zip = shippingDetails.Zip;
        processedItem.Country = shippingDetails.Country;

        processedItem.Status = "Submitted";

        processedItems.SaveItem(processedItem);

    } 

}


    public class EFProcessedItemsRepository : IProcessedItems
{
    private  EFDbContext context = new EFDbContext();

    public IQueryable<ProcessedItems> ProcessedItem
    {
        get { return context.ProcessedItems; }
    }

    public void SaveItem(ProcessedItems processedItem)
    {
        if(processedItem.ProcessedID == 0)
        {
            try
            {
                context.ProcessedItems.Add(processedItem);

                context.SaveChanges();
            }
            catch (Exception)
            {

                throw;
            }

        }
        else
        {
            context.Entry(processedItem).State = EntityState.Modified;

        }
    }

    public void DeleteItem(ProcessedItems processedItem)
    {
        context.ProcessedItems.Remove(processedItem);
        context.SaveChanges();
    }
}

ここでは、processedItem のクラスを示します。

public class ProcessedItems
{
    [Key]
    public int ProcessedID { get; set; }

    public string OrderID { get; set; }
    public int ProductID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
    public string Category { get; set; }
    public string ImageName { get; set; }
    public string Image2Name { get; set; }
    public string Image3Name { get; set; }
    public string Status { get; set; }

    //shipping
    public string BuyerName { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string Line3 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public string Country { get; set; }


}

インターフェース:

public interface IProcessedItems
{
    IQueryable<ProcessedItems> ProcessedItem { get; }
    void SaveItem(ProcessedItems processedItem);
    void DeleteItem(ProcessedItems processedItem);
}
4

3 に答える 3

2

すべてのアイテムを追加した後、)を呼び出してみcontext.SaveChanges(てください。一度にすべてを永続化する必要があると思います。

試してみるもう1つのこと:

SaveItemが保存するアイテムを1つだけ受け入れるようにコードをリファクタリングし、それを追加してSaveChanges()を呼び出します。

メソッドの外でカートアイテムをループし、一度に1つのアイテムでメソッドを呼び出して保存します。

// set orderID, shippingDetails above

foreach(var item in cartItems)
{
    ProcessedItems processedItem = new ProcessedItems();
    processedItem.OrderID = orderID;
    processedItem.ProductID = item.Product.ProductID;
    processedItem.Name = item.Product.Name;
    processedItem.Description = item.Product.Description;
    processedItem.Price = item.Product.Price;
    processedItem.Category = item.Product.Category;
    processedItem.ImageName = item.Product.ImageName;
    processedItem.Image2Name = item.Product.Image2Name;
    processedItem.Image3Name = item.Product.Image3Name;

    processedItem.BuyerName = shippingDetails.Name;
    processedItem.Line1 = shippingDetails.Line1;
    processedItem.Line2 = shippingDetails.Line2;
    processedItem.Line3 = shippingDetails.Line3;
    processedItem.City = shippingDetails.City;
    processedItem.State = shippingDetails.State;
    processedItem.Zip = shippingDetails.Zip;
    processedItem.Country = shippingDetails.Country;
    SubmitItem(processedItem);

}

public void SubmitItem(ProcessedItems processedItem)
{
    processedItem.Status = "Submitted";
    processedItems.SaveItem(processedItem);
}
于 2012-08-15T14:10:37.870 に答える
1

これは、processedItem がループの繰り返しごとに同じインスタンスであるためだと思います。そのため、SaveItem を 1 回通過した後は、ProcessedID が設定されているため、再度処理されることはありません。

于 2012-08-15T14:09:02.053 に答える
0

私の最初の推測では、入力パラメーターであるprocessedItemに格納されているエンティティを常に1つ格納します。各ループで新しいエンティティを作成してから保存してみてください。つまり、入力パラメータに値を割り当てます

processedItem.OrderID = orderID; 

毎回同じエンティティを保存しますが、フィールドは変更されます

processedItems.SaveItem(processedItem);
于 2012-08-15T14:07:21.447 に答える