多对多实体框架更新

时间:2014-04-22 19:15:47

标签: linq entity-framework many-to-many

我有一个与另一个对象有多对多关系的对象。我正在尝试编写一个更新语句,它不会导致必须首先从多对多表中删除所有记录。

我的数据是: StoredProcedure - StoredProcedureId,Name 参数 - ParameterId,Name StoredProcedure_Parameter - StoredProcedureId,ParameterId,Order

我有一个用于更新存储过程对象的UI(添加/删除参数或更改参数的顺序)。

当我保存时,我最终会:

            var storedProcedure = context.Sprocs.FirstOrDefault(s => s.SprocID == sproc.StoredProcedureId);
            if (storedProcedure == null)
            {
                //do something like throw an exception
            } else
            {
                storedProcedure.Name = sproc.Name;
                //resolve Parameters many to many here
                //remove all Params that are not in sproc.Params
                //Add any params that are in sproc.Params but not in storedProcedure.Params
                //Update the Order number for any that are in both

            }

我知道我可以简单地在表上调用.Clear(),然后使用当前状态重新插入所有值(确保UI删除的所有参数都已消失,新的参数被添加,并且更新的订单是改变)。但是,我觉得必须有更好的方法来做到这一点。 EF中的多对多更新通常会通过删除所有元素并重新插入来解决吗?

1 个答案:

答案 0 :(得分:0)

这里有我使用的代码并且它有效。不同的是,我有3个表(StoredProcedure,StoredProcedure_Parameter和Parameter),我有以下3个表:Order,OrdersItem(这确保了多对多关系)和Item。这是我用于更新或添加订单的过程,或者是在我更改现有OrderItem或向订单添加新订单之后的过程。

    public void AddUpdateOrder(Order order)
    {
        using (var db = new vitalEntities())
        {
            if (order.OrderId == 0)
            {
                db.Entry(order).State = EntityState.Added;
            }
            else
            {
                foreach (var orderItem in order.OrdersItems)
                {
                    if (orderItem.OrderItemsId == 0)
                    {
                        orderItem.Item = null;

                        if (order.OrderId != 0)
                            orderItem.OrderId = order.OrderId;

                        db.Entry(orderItem).State = EntityState.Added;
                    }
                    else
                    {
                        orderItem.Order = null;
                        orderItem.Item = null;

                        db.OrdersItems.Attach(orderItem);

                        db.Entry(orderItem).State = EntityState.Modified;
                    }
                }

                db.Orders.Attach(order);
                db.Entry(order).State = EntityState.Modified;
            }


            SaveChanges(db);
        }
    }