1
resposta

Dúvida ao implementar funcionalidade de editar no CRUD

Estou tentando fazer uns CRUD's para praticar e ao tentar realizar edit de uma linha da tabela apresenta seguinte erro:

An exception of type 'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException' occurred in EntityFramework.dll but was not handled in user code

Additional information: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

Segue a classe que geral a tabela e codigo do controler e DAO:

public class Relogio { public int Id { get; set; } public string Empresa { get; set; } public string Modelo { get; set; } public string Pulseira { get; set; } public string Loja { get; set; } public Cidade Cidade { get; set; } public string Pais { get; set; } public decimal ValorReal { get; set; } public decimal ValorDollar { get; set; } public DateTime? DataCompra { get; set; } public string Observacao { get; set; } }

DAO:

public class RelogioDAO { private EntidadesContext context;

public RelogioDAO(EntidadesContext context) { this.context = context; }

public void Adiciona(Relogio relogio) { this.context.Relogios.Add(relogio); this.context.SaveChanges(); }

public void Remove(Relogio relogio) { if(relogio != null) { this.context.Relogios.Remove(relogio); this.context.SaveChanges(); } }

public void Atualiza(Relogio relogio) { if (relogio != null) { this.context.Entry(relogio).State = System.Data.Entity.EntityState.Modified; this.context.SaveChanges(); } }

public IList Lista() { return this.context.Relogios.ToList(); }

public Relogio BuscaPorId(int id) { return this.context.Relogios.Find(id); }

}

CONTROLLER:

public ActionResult InventarioCadastroRelogio() { return View(); }

public ActionResult AdicionaRelogio (Relogio relogio) { if (ModelState.IsValid) { relogioDAO.Adiciona(relogio); return RedirectToAction("InventarioCadastroRelogio"); } else { return View("InventarioCadastroRelogio", relogio); } }

public ActionResult RemoveRelogio (int id) { Relogio relogioRemovido = relogioDAO.BuscaPorId(id); relogioDAO.Remove(relogioRemovido); return RedirectToAction("InventarioConsultaRelogio"); }

public ActionResult MostraRelogio (int id) { Relogio relogioExibido = relogioDAO.BuscaPorId(id); return View(relogioExibido); }

public ActionResult AtualizaRelogio(Relogio relogio) { relogioDAO.Atualiza(relogio); return RedirectToAction("InventarioConsultaRelogio"); }

1 resposta

Isso é um efeito colateral de um recurso chamado de concorrência otimista . A exceção significa que entre o tempo ao buscar dados do banco de dados e modificado , os dados foram alterados.

Por padrão, o Entity Framework implementa um modelo de concorrência otimista. Isto significa que os bloqueios não são mantidos em dados na fonte de dados entre o momento em que os dados são consultados e os dados são atualizados .

São seu projeto usado por vários usuários ? Se for, em seguida, haverá um conflito, como nós estamos usando o bloqueio otimista . Resolver problemas de concorrência usando as entradas ObjectStateManager , e salvar as alterações novamente. Um código de exemplo está lá no site da MSDN(https://msdn.microsoft.com/en-us/library/bb738618(v=vs.100).aspx) .

E uma vez que você estiver usando MVC, por favor, verifique no link abaixo para ver se você está sob este cenário: http://stackoverflow.com/questions/1836173/entity-framework-store-update-insert-or-delete-statement-affected-an-unexpec

Foi causada pelo campo da entidade ID (chave) não sendo definido.