public async Task <IActionResult> Edit(int id, ConcertViewModel model, int?page = null) { ViewBag.Page = page; if (id != model.Id) { return(NotFound()); } if (ModelState.IsValid) { try { ConcertModel concert = await _context.Concerts.SingleOrDefaultAsync(c => c.Id == id); if (concert.Type == model.Type) { if (model.Type == nameof(ClassicalConcertModel)) { ClassicalConcertModel currentClassic = await _context.ClassicalConcerts.SingleOrDefaultAsync(c => c.Id == id); currentClassic.Update(model); _context.Update(currentClassic); } else if (model.Type == nameof(OpenAirModel)) { OpenAirModel currentOpenAir = await _context.OpenAirs.SingleOrDefaultAsync(c => c.Id == id); currentOpenAir.Update(model); _context.Update(currentOpenAir); } else if (model.Type == nameof(PartyModel)) { PartyModel currentParty = await _context.Parties.SingleOrDefaultAsync(c => c.Id == id); currentParty.Update(model); _context.Update(currentParty); } } else { if (model.Type == nameof(ClassicalConcertModel)) { ClassicalConcertModel newConcert = new ClassicalConcertModel(concert); newConcert.Update(model); _context.Concerts.Add(newConcert); } else if (model.Type == nameof(OpenAirModel)) { OpenAirModel newConcert = new OpenAirModel(concert); newConcert.Update(model); _context.Concerts.Add(newConcert); } else if (model.Type == nameof(PartyModel)) { PartyModel newConcert = new PartyModel(concert); newConcert.Update(model); _context.Concerts.Add(newConcert); } _context.Concerts.Remove(concert); } await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!ConcertExists(model.Id)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(Index))); } return(View(model)); }