public JsonResult Save(SalesOrderViewModel vm) { if (ModelState.IsValid == false) { throw new ModelStateException(ModelState); } SalesOrder salesOrder = AppHelpers.CreateSalesOrderFromSalesOrderViewModel(vm); _salesContext.SalesOrders.Attach(salesOrder); if (salesOrder.ObjectState == ObjectState.Deleted) { foreach (SalesOrderItemViewModel orderItem in vm.SalesOrderItems) { SalesOrderItem itemToDelete = _salesContext.SalesOrderItems.Find(orderItem.Id); if (itemToDelete != null) { itemToDelete.ObjectState = ObjectState.Deleted; } } } else { foreach (int itemId in vm.SalesOrderItemsToDelete) { SalesOrderItem itemToDelete = _salesContext.SalesOrderItems.Find(itemId); if (itemToDelete != null) { itemToDelete.ObjectState = ObjectState.Deleted; } } } _salesContext.ApplyStateChanges();// .ChangeTracker.Entries<IObjectWithState>().Single().State = Helpers.ConvertState(salesOrder.ObjectState); string messageToClient = string.Empty; try { _salesContext.SaveChanges(); } catch (DbUpdateConcurrencyException ex) { messageToClient = "Someone else have modified this sales order since you retrieved it. Your changes have not been applied. What you see now are the current values in the database."; } catch (Exception ex) { throw new ModelStateException(ex); } if (vm.ObjectState == ObjectState.Deleted) { return(Json(new { newLocation = "/Sales/Index/" })); } if (string.IsNullOrWhiteSpace(messageToClient)) { messageToClient = AppHelpers.GetMessageToClient(vm.ObjectState, salesOrder.CustomerName, salesOrder.Id); } vm.Id = salesOrder.Id; _salesContext.Dispose(); _salesContext = new SalesContext(); salesOrder = _salesContext.SalesOrders.Find(vm.Id); vm = AppHelpers.CreateSalesOrderViewModelFromSalesOrder(salesOrder); //.SalesOrderId = salesOrder.SalesOrderId; vm.MessageToClient = messageToClient; return(Json(new { salesOrderViewModel = vm })); }