public async Task UpdateRound(RoundEditModel round) { if (round == null) { throw new ArgumentNullException(nameof(round)); } // Update own props var roundToUpdate = await _context.Round.SingleAsync(s => s.Id == round.Id); roundToUpdate.Season = round.Season; roundToUpdate.Venue = round.Venue; roundToUpdate.Note = round.Note; roundToUpdate.Date = round.Date; roundToUpdate.Number = round.Number; roundToUpdate.Name = round.Name; roundToUpdate.Rain = round.Rain.HasValue ? (int)round.Rain.Value : new int?(); roundToUpdate.Status = round.Status.ToString(); roundToUpdate.Rating = round.Rating; roundToUpdate.WinningTeam = round.WinningTeamId; _context.Update(roundToUpdate); await _context.SaveChangesAsync(); // Update winners using (var transactionalQueryExecutor = _queryExecutor.BeginTransaction()) { try { await transactionalQueryExecutor .NewQuery("DELETE FROM [dbo].[RoundWinner] WHERE [Round]=@Round") .WithCommandType(CommandType.Text) .WithParameters(new { Round = round.Id }) .ExecuteAsync(); var winnersToAdd = round.WinningParticipantIds.Select( wp => new RoundWinner { Round = round.Id, Participant = wp }); foreach (var winner in winnersToAdd) { await transactionalQueryExecutor .NewQuery( @"INSERT INTO [dbo].[RoundWinner] ([Round] ,[Participant]) VALUES (@Round ,@Participant)") .WithCommandType(CommandType.Text) .WithParameters(new { Round = winner.Round, Participant = winner.Participant }) .ExecuteAsync(); } transactionalQueryExecutor.Commit(); } catch { transactionalQueryExecutor.Rollback(); throw; } } }
public async Task <IActionResult> Edit(int?id, [Bind("Id,Name,Date,Number,Venue,Rain,Rating,Status,WinningTeamId,WinningParticipantIds[]")][ModelBinder(typeof(RoundEditModel.RoundEditModelBinder))] RoundEditModel round) { if (id == null) { return(NotFound()); } if (id != round.Id) { return(NotFound()); } var roundForValidation = await _roundService.LoadDataRecord(id.Value); roundForValidation.Season = round.Season; roundForValidation.Name = round.Name; roundForValidation.Date = round.Date; roundForValidation.Number = round.Number; roundForValidation.Venue = round.Venue; roundForValidation.Note = round.Note; await _roundModelStatePopulator.ValidateAndPopulateForUpdate(ModelState, id.Value, roundForValidation); if (ModelState.IsValid) { await _roundService.UpdateRound(round); var roundDisplayModel = await _roundService.LoadDisplayModel(id.Value); if (roundDisplayModel == null) { return(NotFound()); } return(RedirectToAction(nameof(Index), new { id = roundDisplayModel.Season })); } return(View(await _roundService.LoadDisplayModel(id.Value))); }