public async Task <IActionResult> Edit(int id) { ViewData["Title"] = "Modifica lezione"; LessonEditInputModel inputModel = await lessonService.GetLessonForEditingAsync(id); return(View(inputModel)); }
public async Task <LessonDetailViewModel> EditLessonAsync(LessonEditInputModel inputModel) { Lesson lesson = await dbContext.Lessons.FindAsync(inputModel.Id); if (lesson == null) { throw new LessonNotFoundException(inputModel.Id); } lesson.ChangeTitle(inputModel.Title); lesson.ChangeDescription(inputModel.Description); lesson.ChangeDuration(inputModel.Duration); lesson.ChangeOrder(inputModel.Order); dbContext.Entry(lesson).Property(lesson => lesson.RowVersion).OriginalValue = inputModel.RowVersion; try { await dbContext.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { throw new OptimisticConcurrencyException(); } return(LessonDetailViewModel.FromEntity(lesson)); }
public async Task <LessonDetailViewModel> EditLessonAsync(LessonEditInputModel inputModel) { LessonDetailViewModel viewModel = await lessonService.EditLessonAsync(inputModel); memoryCache.Remove($"Course{viewModel.CourseId}"); memoryCache.Remove($"Lesson{viewModel.Id}"); return(viewModel); }
public async Task <LessonEditInputModel> GetLessonForEditingAsync(int id) { IQueryable <LessonEditInputModel> queryLinq = dbContext.Lessons .AsNoTracking() .Where(lesson => lesson.Id == id) .Select(lesson => LessonEditInputModel.FromEntity(lesson)); //Usando metodi statici come FromEntity, la query potrebbe essere inefficiente. Mantenere il mapping nella lambda oppure usare un extension method personalizzato LessonEditInputModel inputModel = await queryLinq.FirstOrDefaultAsync(); if (inputModel == null) { logger.LogWarning("Lesson {id} not found", id); throw new LessonNotFoundException(id); } return(inputModel); }
public async Task <LessonEditInputModel> GetLessonForEditingAsync(int id) { FormattableString query = $@"SELECT Id, CourseId, Title, Description, Duration, RowVersion, [Order] FROM Lessons WHERE ID={id}"; DataSet dataSet = await db.QueryAsync(query); //Course var lessonTable = dataSet.Tables[0]; if (lessonTable.Rows.Count != 1) { logger.LogWarning("Lesson {id} not found", id); throw new LessonNotFoundException(id); } var lessonRow = lessonTable.Rows[0]; var lessonEditInputModel = LessonEditInputModel.FromDataRow(lessonRow); return(lessonEditInputModel); }
public async Task <IActionResult> Edit(LessonEditInputModel inputModel) { if (ModelState.IsValid) { try { LessonDetailViewModel viewModel = await lessonService.EditLessonAsync(inputModel); TempData["ConfirmationMessage"] = "I dati sono stati salvati con successo"; return(RedirectToAction(nameof(Detail), new { id = viewModel.Id })); } catch (OptimisticConcurrencyException) { ModelState.AddModelError("", "Spiacenti, il salvataggio non è andato a buon fine perché nel frattempo un altro utente ha aggiornato la lezione. Ti preghiamo di aggiornare la pagina e ripetere le modifiche."); } } ViewData["Title"] = "Modifica lezione"; return(View(inputModel)); }
public async Task <LessonDetailViewModel> EditLessonAsync(LessonEditInputModel inputModel) { int affectedRows = await db.CommandAsync($"UPDATE Lessons SET Title={inputModel.Title}, Description={inputModel.Description}, Duration={inputModel.Duration:HH':'mm':'ss}, [Order]={inputModel.Order} WHERE Id={inputModel.Id} AND RowVersion={inputModel.RowVersion}"); if (affectedRows == 0) { bool lessonExists = await db.QueryScalarAsync <bool>($"SELECT COUNT(*) FROM Lessons WHERE Id={inputModel.Id}"); if (lessonExists) { throw new OptimisticConcurrencyException(); } else { throw new LessonNotFoundException(inputModel.Id); } } LessonDetailViewModel lesson = await GetLessonAsync(inputModel.Id); return(lesson); }