Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 多对多实体框架更新_Linq_Entity Framework_Many To Many - Fatal编程技术网

Linq 多对多实体框架更新

Linq 多对多实体框架更新,linq,entity-framework,many-to-many,Linq,Entity Framework,Many To Many,我有一个与另一个对象有多对多关系的对象。我试图编写一个update语句,它不会导致必须首先删除多对多表中的所有记录 我的数据是: StoredProcedure-StoredProcedureId,名称 参数-参数ID,名称 StoredProcedure_参数-StoredProcedureId,参数化,订单 我有一个用于更新存储过程对象(添加/删除参数或更改参数顺序)的UI 当我保存时,我将在以下位置结束: var storedProcedure = context.

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

我的数据是: StoredProcedure-StoredProcedureId,名称 参数-参数ID,名称 StoredProcedure_参数-StoredProcedureId,参数化,订单

我有一个用于更新存储过程对象(添加/删除参数或更改参数顺序)的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的多对多更新通常通过删除所有元素并重新插入来解决吗?

这里是我使用的代码,它可以正常工作。不同之处在于,我没有使用3个表(StoredProcedure、StoredProcedure_参数和参数),而是使用以下3个表:Order、OrdersItem(这确保了多对多关系)和Item。这是我用于更新或添加订单的过程,或者在我更改现有OrderItem或向订单添加新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);
        }
    }