我有一个与另一个对象有多对多关系的对象。我正在尝试编写一个更新语句,它不会导致必须首先从多对多表中删除所有记录。
我的数据是: 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中的多对多更新通常会通过删除所有元素并重新插入来解决吗?
答案 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);
}
}