public IHttpActionResult UpdateAgreement(int id, [FromBody] BaseRate.RateType newBaseRateType) { Agreement agreement = db.Agreements.Include("Customer").SingleOrDefault(x => x.Id == id); if (agreement == null) { return(NotFound()); } BaseRate.RateType oldBaseRateType = agreement.BaseRateType; agreement.BaseRateType = newBaseRateType; db.MarkAsModified(agreement); try { db.SaveChanges(); } catch (Exception ex) { return(InternalServerError(ex)); } // check if base rate record exists BaseRate currentBaseRate = db.BaseRates.SingleOrDefault(x => x.Code == oldBaseRateType); BaseRate newBaseRate = db.BaseRates.SingleOrDefault(x => x.Code == newBaseRateType); if (currentBaseRate == null || newBaseRate == null) { // Better solution would be to throw a custom exception with an error message return(InternalServerError(new ArgumentNullException("Base Rate record was not found"))); } // to client we need to return an agreement with an old base rate type agreement.BaseRateType = oldBaseRateType; var agremeentExtended = Agreements.GetExtendedAgreement(agreement, newBaseRateType, currentBaseRate.Value, newBaseRate.Value); return(Ok(agremeentExtended)); }