// PUT: /ExerciseItems/5 /// <summary> /// Support for updating exercise items /// </summary> public async Task <IActionResult> Put([FromODataUri] int key, [FromBody] ExerciseItem update) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (key != update.ID) { return(BadRequest("Key is not matched")); } String usrId = ControllerUtil.GetUserID(this); if (String.IsNullOrEmpty(usrId)) { return(new UnauthorizedResult()); } var isexist = await _context.ExerciseItems.Where(p => p.ID == key).CountAsync(); if (isexist <= 0) { return(NotFound()); } // Update itself update.ModifiedAt = DateTime.Now; _context.Entry(update).State = EntityState.Modified; // Tags var tagsindb = _context.ExerciseTags.Where(p => p.RefID == update.ID).AsNoTracking().ToList(); foreach (var ditem in update.Tags) { var itemindb = tagsindb.Find(p => p.TagTerm == ditem.TagTerm); if (itemindb == null) { _context.ExerciseTags.Add(ditem); } } foreach (var ditem in tagsindb) { var nitem = update.Tags.FirstOrDefault(p => p.TagTerm == ditem.TagTerm); if (nitem == null) { _context.ExerciseTags.Remove(ditem); } } // Answer var answerindb = _context.ExerciseItemAnswers.Where(p => p.ID == update.ID).AsNoTracking().FirstOrDefault(); if (answerindb == null) { // Not exist if (update.Answer != null) { // Insert _context.ExerciseItemAnswers.Add(update.Answer); } } else { // Already in DB if (update.Answer != null) { // Insert _context.Entry(update.Answer).State = EntityState.Modified; } else { _context.ExerciseItemAnswers.Remove(answerindb); } } try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { throw; } return(Updated(update)); }