none
Concurrencia optimista en ambiente desconectado y aplicacion en capas RRS feed

  • Pregunta

  • Hola amigos,  cual deberia ser la manera de manejar la concurrencia optimista en EF 4 si por ejemplo un otro usuario modifca primero el mismo registro que yo estoy actualizando y cuando le de savechanges() pues el detecte la concurrencia y entonces yo pueda decidir si dejo los datos que el otro usuario actualizó o los remplazo con los mios......??

     

    martes, 2 de agosto de 2011 16:27

Respuestas

Todas las respuestas

  • Hola Libardo,

    cuando ejecutes el método SaveChanges() del contexto, puedes capturar una excepción (OptimisticConcurrencyException) para controlar los conflictos. Mira este artículo de la MSDN

    http://msdn.microsoft.com/en-us/library/bb738618.aspx

     


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
    martes, 2 de agosto de 2011 16:49
  • Hola Alberto gracias por tu respuesta, lo que pasa es que es una aplicacion en capas con entidades POCO, y tengo esta fraccion de codigo en la capa de datos : y siempre detecta error de concurrencia y entra y me hace la pregunta, y pues yo lo que queiro es que solo me pregunte cuando realmente haya infraccion de concurrencia.
    public void Update(Bodega updBod)
        {
          var dbBod = _contexto.Bodegas.OfType<Bodega>()
                  .First(c => c.BodegaID == updBod.BodegaID);
          /_contexto.Bodegas.Attach(updBod);
          _contexto.ObjectStateManager.ChangeObjectState(updBod, System.Data.EntityState.Modified);
          try
          {
            _contexto.SaveChanges();
          }
    
          catch (OptimisticConcurrencyException ex)
          {
            DialogResult result = MessageBox.Show(
              "El registro en la base de datos fue modificado despues de ser consultado, ¿desea que los cambios se actualicen? ",
              "Atencion", MessageBoxButtons.YesNo);
            switch (result)
            {
              case DialogResult.Yes:
                {
                  _contexto.Refresh(RefreshMode.ClientWins, ex.StateEntries.Select(e => e.Entity));
                  _contexto.SaveChanges();
                  break;
                }
              case DialogResult.Cancel:
                {
                  _contexto.Refresh(RefreshMode.StoreWins, ex.StateEntries.Select(e => e.Entity));
                  _contexto.SaveChanges();
                  break;
                }
            }
          }
    

    martes, 2 de agosto de 2011 17:05
  • Con POCO deberías de tener un campo en tu identidad del tipo Timestamp que permita identificar la versión de la entidad. Revisa este artículo.

    http://blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic-concurrency-in-the-entity-framework.aspx

     


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
    martes, 2 de agosto de 2011 17:48
  • Gracias esta interesante el link y bueno mi dada va mas hacia la ultima parte del articulo : Of course in the real world things are seldom this simple. Your requirements probably states that you have to give the user the ability to compensate and retry. How do you do that exactly?

     

    algun link que responsa a eso? :)

     

    Muchas gracias!

    martes, 2 de agosto de 2011 18:43
  • Hoy estamos de oferta, va un link a ver si te vale

    http://www.asp.net/entity-framework/tutorials/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

     


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
    • Marcado como respuesta Libardo martes, 2 de agosto de 2011 18:52
    martes, 2 de agosto de 2011 18:44
  • Hola, gracias que bueno que encontre oferta....jejeje :) bueno aunque no se  mucho de MVC, el link me ha dado mas claridad sobre lo que quiero hacer, sigo investigando el ejemplo y aplicarlo en Windows Form.

     

    Gracias por tu ayuda.

    martes, 2 de agosto de 2011 18:55