none
Problemas de concurrencia EF RRS feed

  • Pregunta

  • Hola, me estoy encontrando con un problema un tanto curioso que me temo es de concurrencia.

    Hice una aplicación que accede a una BD SQL Server Express 2008 R2 utilizando el Entity Framework 4. El caso está en que esta aplicación en principio era monopuesto y funcionaba todo sin problemas en local. Ahora el cliente necesita convertirla en multipuesto, modifiqué la cadena de conexión para poder acceder en remoto al SQL Server y en principio parece que funciona pero me encuentro con lo siguiente:

    Tengo un objeto Producto que tiene un atributo Stock. Hay veces que el valor de este atributo de repente varía en un equipo o en otro. Muchas veces estos problemas se han solucionado cerrando la aplicación en el equipo con el dato erroneo y volviéndola a ejecutar. Supongo que todo esto tendrá que ver con el modelo desconectado de ADO.NET ¿cierto? ¿hay alguna forma para que todas las consultas que hace el Entity Framework se hagan directamente contra el SQL Server? sería como devolver ADO.NET a un modo conectado ¿no?

    Esta aplicación ha sido mi primera experiencia con Entity Framework y no se muy bien por donde pueden ir los tiros, pero imagino que es más por aquí, si alguien me puede echar una mano...

     

    Saludos!

     


    Saludos, Juan Baixauli
    viernes, 3 de diciembre de 2010 8:34

Todas las respuestas

  • Si desde la aplicación en el PC1 se modifica el valor de stock en la BBDD y la aplicación en el PC2 ya lo tenía en memoria, salvo que se uelva a leer de la BBDD el PC2 tendrá el valor incorrecto. Esto es normal que sea así.

    Para solucionarlo, puedes hacer desde lo más simple que es poner un botoncito a tus usuarios para que vuelva a cargarse la entidad desde la BBDD, hasta un sistema de eventos donde el pc que modifique avise al resto de que han cambiado los datos, o utilizar algún tipo de cache distribuido.

    Personalmente, te recomendaría que a cada ventana que abras/cierres vuelvas a leer los valores frescos de la BBDD (abre y cierra el contexto en cada acceso), además de repasar la política de concurrencia que utilices: en vez de que gane el último que escribe, mejor utiliza timestamps.

    Échale un ojo a esto: http://visualstudiomagazine.com/articles/2009/05/27/handling-concurrency-with-entity-framework.aspx

    Espero haberte ayudado en vez de liarte más :)


    No olvides marcar la respuesta si te ha ayudado! http://bmegias.wordpress.com http://twitter.com/bmegias
    viernes, 3 de diciembre de 2010 18:35
  • Hola,

    Primero, disculpa el retraso en contestar.

    Voy a probar la solución que me propones a ver si con esto se soluciona, en principio por lo que entiendo los cambios en código para cambiar la política de concurrencia no son muchos ¿no?

    1. Añadir una columna en todas las tablas de tipo timestamp

    2. En el diseñador de EF recargar las clases y seleccionar esa columna cambiando el atributo de concurrencia a "fixed"

    y... en principio con esto se debería solucionar?

    Si hago lo de cargar los valores de la BBDD lo malo que veo es que son bastantes datos y hacerlo cada vez puede provocar retrasos en la carga de la ventana bastante importantes ¿no?

    Saludos.


    Saludos, Juan Baixauli
    viernes, 17 de diciembre de 2010 11:39