c# - Entity Framework 保存循环中的第一项,但不保存其他项

标签 c# asp.net asp.net-mvc entity-framework

在我的 Controller 中,我循环遍历项目并将它们保存到我的数据库中。问题是它保存了第一个项目,但没有保存其他项目。我在循环中的“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();
    }
}

这是已处理项目的类:

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);
}

最佳答案

尝试在添加所有项目后调用context.SaveChanges(),我认为它应该一次性将它们全部保留。

另一件事要尝试:

重构您的代码,以便 SaveItem 仅接受一项要保存的内容,添加它并调用 SaveChanges()

在方法外部循环访问购物车商品,并调用该方法一次保存一个商品。

// 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);
}

关于c# - Entity Framework 保存循环中的第一项,但不保存其他项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11970636/

相关文章:

c# - 设置自定义保存对话框属性

c# - Dictionary<T,T> 的替代品

javascript - Bootstrap 模式加载远程内容生成 2 个请求

c# - 在 C# 代码中分隔大数字的数字

jquery - ckeditor jquery 集成

c# - IOwinContext 上下文为空

c# - 类和方法看不到属性asp

c# - 远程调试asp.net

asp.net-mvc - ASP.NET MVC - 局部 View 可以有 Controller 吗?

javascript - 传递参数日期时间?在 mvc 和 jquery 中