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