删除不再收藏的物品的最佳方法

时间:2013-12-16 19:50:51

标签: c# entity-framework collections

我的数据库中有一个经典的Order项目:

public partial class ORDERS
{
    public ORDERS()
    {
        this.ORDER_DETAIL = new HashSet<ORDER_DETAIL>();
    }

    public int ORDER_IDE { get; set; }
    public string ORDER_STATE { get; set; }
    public decimal ORDER_TOTAL { get; set; }
    public decimal ORDER_TAXES { get; set; }
    public decimal ORDER_SHIPPING_COST { get; set; }
    public decimal ORDER_HANDLING_COST { get; set; }
    public Nullable<System.DateTime> ORDER_SHIPPING_DATE { get; set; }
    public string ORDER_BILLING_NAME { get; set; }
    public string ORDER_BILLING_ADDRESS { get; set; }
    public string ORDER_BILLING_CITY { get; set; }
    public string ORDER_BILLING_REGION { get; set; }
    public string ORDER_BILLING_COUNTRY { get; set; }
    public string ORDER_BILLING_POSTAL_CODE { get; set; }
    public string ORDER_SHIPPING_NAME { get; set; }
    public string ORDER_SHIPPING_ADDRESS { get; set; }
    public string ORDER_SHIPPING_CITY { get; set; }
    public string ORDER_SHIPPING_REGION { get; set; }
    public string ORDER_SHIPPING_COUNTRY { get; set; }
    public string ORDER_SHIPPING_POSTAL_CODE { get; set; }
    public string ORDER_COMMENT { get; set; }
    public decimal ORDER_DETAIL_AMOUNT { get; set; }
    public string ORDER_DESCRIPTION { get; set; }
    public decimal ORDER_DISCOUNT { get; set; }

    public virtual ICollection<ORDER_DETAIL> ORDER_DETAIL { get; set; }
}

如您所见,此项目的集合为ORDER_DETAIL。在我的项目中,我想保存对订单所做的修改,仅保留当前的订单详细信息。所以我这样做:

public void SaveOrderModifications(ORDERS _orderToReceive)
{
    using (mDb = new DatabaseEntity())
    {
        mDb.Database.Connection.Open();

        var orderQry = from o in mDb.ORDERS
                       where o.ORDER_IDE == _orderToReceive.mOrderID
                       select o;

        ORDERS originalOrder = orderQry.FirstOrDefault();

        if (originalOrder == null)
        {
            throw new Exception("Invalid operation");
        }

        mDb.Entry(originalOrder).CurrentValues.SetValues(_orderToReceive);

        mDb.SaveChanges();
    }
}

因此,如果我的原始订单有3个项目,并且我的新订单有8个,并且从原始订单中的2个订单被转储,我需要做什么才能有效地保留8个新项目?我是否需要遍历所有这些内容以查看哪些内容,以及哪些内容不再存在?

修改

我找到了一个不优雅的解决方案,耗费了一些过程:

foreach (var orderDetail in originalOrder.ORDER_DETAIL.ToList())
{
    mDb.ORDER_DETAIL.Remove(orderDetail);

    mDb.SaveChanges();
}

foreach (var orderDetail in orderToSave.ORDER_DETAIL)
{
    mDb.ORDER_DETAIL.Add(orderDetail);

    mDb.SaveChanges();
}

这意味着我在添加新的ORDER_DETAIL对象之前将其刷新,但我仍然在寻找一种更优雅/更好的做事方式。

1 个答案:

答案 0 :(得分:0)

通常我的方式与您的方式相同,但我检查项目是否在新项目上,只添加和删除更改的项目。它增加了一些优雅,因为你可以使用Linq表达式。

产生效果:

foreach (var orderDetail in originalOrder.ORDER_DETAIL.Where(d => !newOrder.ORDER_DETAIL.Contains(d)).ToList())
{
    mDb.ORDER_DETAIL.Remove(orderDetail);

    mDb.SaveChanges();
}