public async Task <IActionResult> Edit(int id, [Bind("Id,Name")] Department department) { if (id != department.Id) { return(NotFound()); } if (ModelState.IsValid) { try { _context.Update(department); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!DepartmentExists(department.Id)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(Index))); } return(View(department)); }
// Agora vamos incluir uma operação "Update" , no caso um objecto do tipo "Seller" public async Task UpdateAsync(Seller obj) /* o que é que vai ser "Update" um objecto do tipo Seller? * A primeira coisa que vou ter que fazer é testar se esse "id" desse objecto já existe no banco. * Porque como estou atualizando o "id" desse objecto, já tem que existir*/ /* Para fazer isto eu vou ter que chamar o meu _context.Seller.Any ( o any serve para falar se existe algum registo no banco de dados com a condição que voçe irá colocar dentro dos () * x que leva em x.id igual ao obj.Id. * Então eu estou testando se ja existe no banco de dados algum vendedor x cujo o "id" seja igual ao "id" do meu objecto*/ { // Aqui o bool hasAny --> quer se tem algum e depois receberá a chamada bool hasAny = await _context.Seller.AnyAsync(x => x.Id == obj.Id); if (!hasAny) // Se nao existir vou ter que lançar uma excepção { throw new NotFoundException(" I did not found"); } // Se passar por esse If é porque já existe esse objecto la na bd e irei apenas atualizar; // Entao agora para atualizar e salvar a atualização vou fazer um bloco try e depois um catch para capturar _context.Update(obj) e depois save /* Mas agora aqui tem um problema quando voçe chama a operaç~ºao atualizar no banco de dados, este pode retornar uma excepção de conflito de concorrencia, * Se esse erro ocorrer no banco de dados, o Entity Framework vai produzir uma excepção chamada dbupdate, entao iremos colocar um bloco try e um catch para capturar * uma possivel excepção de concorrencia do banco de dados. * No caso se acontecer ocorrer a tal excepção de concorrencia de dados ai vou ter que lançar uma nova excepcao de serviços e ai irei colocar uma "messagem" que veio do banco de dados*/ try { _context.Update(obj); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException e) { throw new DbConcurrencyException(e.Message); } // Nota: Conclusão /* O que é que eu estou fazendo com o try e catch? * Eu estou interceptando uma excepção no caso do "catch" do nivel de acessos a dados e depois estou relançando essa excepção só que lançando essa minha excepção a nivel de serviços * * A minha camada de serviço não vai propagar, difundir, uma excepção do nivel de acesso a dados, se uma excepção de nivel de acesso a dados acontecer, a minha camada de serviços ela vai lançar * uma excepção da camada dela. e ai o meu controlador que no caso vai ser o "SellerController", ele vai ter que lidar só com as excepçõs da camada de serviços * * * * * Nota muito importante: * * O controlador conversa com a camada de serviços, excepções de nivel de acesso a dados são capturadas pelo o serviço e relançadas nas formas de excepções de serviço para o controlador*/ }