删除项目,如果订单没有更多项目,则删除整个订单

本文关键字:删除 项目 如果 单没 删除项目 | 更新日期: 2023-09-27 17:59:24

下面的代码从不删除订单,即使最后一项被删除了——为什么?如果没有更多项目,我想删除订单吗?

    int orderItemId = 5;
    OrderItem orderItem = DbContext.OrderItem.Find(orderItemId);
    Order order = DbContext.Order.Find(orderItem.OrderId);
    DbContext.OrderItem.Remove(orderItem);
    if (DbContext.OrderItem.Count(x => x.OrderId == order.Id) == 0)
    {
           DbContext.Order.Remove(order);
    }
    DbContext.SaveChanges();

删除项目,如果订单没有更多项目,则删除整个订单

DbContext.OrderItem.Remove(orderItem); // [1]
if (DbContext.OrderItem.Count(x => x.OrderId == order.Id) == 0) // [2]
{
    DbContext.Order.Remove(order);
}
DbContext.SaveChanges(); // [3]

当您从[1]行的OrderItem集合中删除orderItem时,它实际上并没有在数据库中删除。项目将仅在[3]行的SaveChanges()调用中删除。在此之前,orderItem只是发布删除,但没有删除。

但当您在[2]行查询项目计数时,它是从数据库中查询的,该数据库包含orderItem

在检查现有项目之前,您需要将更改提交到数据库:

DbContext.OrderItem.Remove(orderItem);
DbContext.SaveChanges();
if (!DbContext.OrderItem.Any(x => x.OrderId == order.Id))
{
    DbContext.Order.Remove(order);
    DbContext.SaveChanges();
}

您需要先获取要删除的项,然后刷新。试试这个更强大的解决方案,告诉我你会得到什么结果:

var id = "2";
var orderItem = db.OrderItems.SingleOrDefault(item => item.Id == id);
if(orderItem != null)
{
    // The items exists. So we remove it and calling 
    // the db.SaveChanges this will be removed from the database.
    db.OrderItems.Remove(orderItem);
    db.SaveChanges();
    // Refresh or update any visible data with the new data source.
    refreshGrid();
}
else {
    // Replace orderItem.Id with identifying order item property.
    Console.WriteLine(
        String.Format("Attempted to remove order {0}, but it could not be found.", orderItem.Id)
    );
}