none
Concurrency Mode Code First RRS feed

  • Pergunta

  • Galera, estou precisando implementar Concurrency Mode com o Code First, estou usando o EF 5.0, porém como o meu projeto é Web, não estou conseguindo fazer funcionar direito.

    o que esta acontecendo, no sistema eu abro o mesmo cadastro em dois navegadores diferentes em um deles faço a alteração e salvo, no outro só salvo sobrescrevendo as alterações salvas no outro navegador, mesmo com as colunas marcadas com o atributo ConcurrencyCheck.

    qual seria a melhor estratégia para implementar Concorrência em um projeto web?

    terça-feira, 30 de abril de 2013 19:57

Respostas

  • Boa noite,

    Altere o seu método de edição para este:

    [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Edit(TesteEntity testeentity)
            {
                if (ModelState.IsValid)
                {
                    db.Entry(testeentity).State = EntityState.Modified;
                    DbPropertyValues dbPropertyValues = db.Entry(testeentity).GetDatabaseValues();
                    db.Entry(testeentity).Property(b => b.Descricao).OriginalValue = dbPropertyValues["Descricao"].ToString();
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(testeentity);
            }


    Att,
    Leandro

    Se foi útil, marque como útil ou como resposta.

    • Sugerido como Resposta Leandro Tozetto quarta-feira, 1 de maio de 2013 01:19
    • Marcado como Resposta Pablotdv quarta-feira, 1 de maio de 2013 01:35
    quarta-feira, 1 de maio de 2013 01:19

Todas as Respostas

  • aqui tem um exemplo do que estou tentando fazer

    public class TesteEntity
        {
            [Key]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public int TesteId { get; set; }
    
            [ConcurrencyCheck()]
            public string Descricao { get; set; }
        }
    
    public class TesteContext : DbContext
        {
            public DbSet<TesteEntity> TesteEntity { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
    
                Database.SetInitializer(new CreateDatabaseIfNotExists<TesteContext>());
    
                base.OnModelCreating(modelBuilder);
            }
        }
    
    public class HomeController : Controller
        {
            private TesteContext db = new TesteContext();
    
            //
            // GET: /Home/
    
            public ActionResult Index()
            {
                return View(db.TesteEntity.ToList());
            }
    
            //
            // GET: /Home/Details/5
    
            public ActionResult Details(int id = 0)
            {
                TesteEntity testeentity = db.TesteEntity.Find(id);
                if (testeentity == null)
                {
                    return HttpNotFound();
                }
                return View(testeentity);
            }
    
            //
            // GET: /Home/Create
    
            public ActionResult Create()
            {
                return View();
            }
    
            //
            // POST: /Home/Create
    
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create(TesteEntity testeentity)
            {
                if (ModelState.IsValid)
                {
                    db.TesteEntity.Add(testeentity);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
    
                return View(testeentity);
            }
    
            //
            // GET: /Home/Edit/5
    
            public ActionResult Edit(int id = 0)
            {
                TesteEntity testeentity = db.TesteEntity.Find(id);
                if (testeentity == null)
                {
                    return HttpNotFound();
                }
                return View(testeentity);
            }
    
            //
            // POST: /Home/Edit/5
    
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Edit(TesteEntity testeentity)
            {
                if (ModelState.IsValid)
                {
                    db.Entry<TesteEntity>(testeentity).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(testeentity);
            }
    
            //
            // GET: /Home/Delete/5
    
            public ActionResult Delete(int id = 0)
            {
                TesteEntity testeentity = db.TesteEntity.Find(id);
                if (testeentity == null)
                {
                    return HttpNotFound();
                }
                return View(testeentity);
            }
    
            //
            // POST: /Home/Delete/5
    
            [HttpPost, ActionName("Delete")]
            [ValidateAntiForgeryToken]
            public ActionResult DeleteConfirmed(int id)
            {
                TesteEntity testeentity = db.TesteEntity.Find(id);
                db.TesteEntity.Remove(testeentity);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
    
            protected override void Dispose(bool disposing)
            {
                db.Dispose();
                base.Dispose(disposing);
            }
        }

    terça-feira, 30 de abril de 2013 20:42
  • Usando esse exemplo, estou tendo o seguinte erro quando dou um Edit 

    A instrução de atualização, inserção ou exclusão de repositório afetou um número inesperado de linhas (0). As entidades podem ter sido modificadas ou excluídas após o carregamento. Atualize as entradas do ObjectStateManager.

    Link pra quem quiser baixar o exemplo



    • Editado Pablotdv terça-feira, 30 de abril de 2013 23:08
    terça-feira, 30 de abril de 2013 21:43
  • Boa noite,

    Altere o seu método de edição para este:

    [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Edit(TesteEntity testeentity)
            {
                if (ModelState.IsValid)
                {
                    db.Entry(testeentity).State = EntityState.Modified;
                    DbPropertyValues dbPropertyValues = db.Entry(testeentity).GetDatabaseValues();
                    db.Entry(testeentity).Property(b => b.Descricao).OriginalValue = dbPropertyValues["Descricao"].ToString();
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(testeentity);
            }


    Att,
    Leandro

    Se foi útil, marque como útil ou como resposta.

    • Sugerido como Resposta Leandro Tozetto quarta-feira, 1 de maio de 2013 01:19
    • Marcado como Resposta Pablotdv quarta-feira, 1 de maio de 2013 01:35
    quarta-feira, 1 de maio de 2013 01:19
  • essa alteração resolveu, agora só preciso deixar isso ai mais dinâmico pra qualquer entidade no meu projeto.
    quarta-feira, 1 de maio de 2013 01:35
  • quem tiver interesse pode ler um pequeno artigo que escrevi.

    Concurrency Mode

    quarta-feira, 1 de maio de 2013 14:27