I have two tables, Promotion and PromotionLine, with a foreign key defined as PromotionLine.PromoID = Promotion.ID
PromotionLines are associated with the Promotion m
This is not a trivial task. You need to update your object graph. In other word you need a Master-Detail update.
To keep the answer simple I suppose I have an Order entity that have OrderDetails property that is a List.You should pay attention when editing:
OrderDetail that have been added to OrderDetails and the main sign of them is having Id property equal to 0.OrderDetail have been removed and no longer exist in OrderDetailsOrderDetail have been changed.When updating the Order you should update the Order itself and also apply above changes.
Steps
Here are steps:
Code
Here is the code:
public void Update(Order editedOrder)
{
using(var context = new YourDbContext())
{
//Get original order from database.
var originalOrder = context.Orders.Including("OrderDetails")
.Where(x => x.OrderId == editedOrder.OrderId).FirstOrDefault();
//Update the value of original order using edited order.
context.Entry(originalOrder).CurrentValues.SetValues(editedOrder);
//Find list of added items (Id of added items is 0).
var addedList = editedOrder.OrderDetails
.Where(y => y.OrderDetailId == 0).ToList();
//Find list of removed items.
var deletedList = originalOrder.OrderDetails
.Where
(
x =>!editedOrder.OrderDetails.Select(y => y.OrderDetailId)
.Contains(x.OrderDetailId)
)
.ToList();
//Find list of edited items.
var editedList = editedOrder.OrderDetails
.Where
(
y => originalOrder.OrderDetails.Select(z => z.OrderDetailId)
.Contains(y.OrderDetailId)
)
.ToList();
//Use a loop over deleted items list and set state of them to removed.
deletedList.ForEach(deletedDetail =>
{
originalOrder.OrderDetails.Remove(deletedDetail);
context.Entry(editedOrder).State = EntityState.Deleted;
});
//Use a loop over edited items list
//and update value of original order details that have been loaded in context.
editedList.ForEach(editedDetail =>
{
var originalOrderDetail = originalOrder.OrderDetails
.Where(x => x.OrderDetailId == editedDetail.OrderDetailId)
.FirstOrDefault();
context.Entry(originalOrderDetail).CurrentValues.SetValues(editedDetail);
});
//Use a loop over added items list and set state of them to added.
addedList.ForEach(addedDetail =>
{
originalOrder.OrderDetails.Add(addedDetail);
});
//Set the state of original order to modified.
context.Entry(oroginalOrder).State = System.Data.Entity.EntityState.Modified;
//Save context changes.
context.SaveChanges();
}
}