8.23.2011

Nuevo Blog

Como parte del proceso de especialización de este blog – en realidad lo pensé como un blog de arquitectura y desarrollo de software – he decidido abrir otro blog más especializado exclusivamente en el tema de computación en la nube. El blog va a estar disponible desde esta dirección: http://workingonthecloud.wordpress.com/. Esto no quiere decir que voy a dejar de bloguear aquí – de hecho ya viene la parte 2 del problema de concurrencia en el entity framework – si no más bien que cuando escriba de cloud computing – azure, aws, SF, etc lo haré en el nuevo blog.

Espero esta semana empezar a bloguear desde el mismo. Gracias por el apoyo a este blog y espero al que se empieza a crear desde ahora Sonrisa

8.17.2011

Presentación Charla Cloud Computing

Tal y como lo comenté en la charla, la presentación mostrada esta disponible desde el blog. Espero la disfruten.

Etiquetas de Technorati:

8.15.2011

Concurrencia y el Entity Framework – Parte 1

Existen muchos temas que con el pasar del tiempo y las nuevas facilidades que tienen los frameworks que vamos incorporando al proceso del desarrollo del software tendemos a dejar de lado. Uno de estos temas es el manejo de la concurrencia cuando utilizamos el entity framework.

Concurrencia Optimista vrs Concurrencia Pesimista

Existen dos escenarios claves a la hora de manejar la concurrencia en las aplicaciones, el optimista y el pesimista. En el primer caso – el optimista – muchos clientes pueden acceder el registro y de ser el caso modificarlo, eliminarlo o solo consultarlo; en este caso el cliente que haga la última modificación es el que prevalece – excepto por el borrado. En el caso de la concurrencia pesimista un cliente bloquea el acceso a un registro y nadie más puede efectuar una operación sobre el mismo; en este caso, pueden existir variaciones de comportamiento ya que el cliente lo puede bloquear para lectura, por lo tanto otros clientes podrían bloquearlo para lectura también pero no para cambios. Los escenarios pesimistas por lo general son muy complicados de programar – aunque hay situaciones en donde es la única opción. En el caso del Entity Framework se utiliza la concurrencia optimista, por lo que se debe de tener mucho cuidado a la hora de trabajar con este tema.

Trabajando con la Concurrencia Optimista

Para entender mejor el tema, vamos a crear un ejemplo muy simple en donde vamos a ver como reacciona el Entity Framework a la concurrencia. En este ejemplo, vamos a obtener un registro para editar – voy a usar el MVC 3 – y luego desde otra sesión voy a editar el registro y voy a ingresar el dato antes que la primera sesión lo haga.

La tabla que vamos a utilizar es la siguiente:

image

Esta tabla fue generada a partir de los objetos pocos que fueron creados en el proyecto. El objeto POCO que generó esta tabla es el siguiente:

image

Aunque esta tabla tiene una relación a las asignaciones, para este ejemplo no vamos a utilizar dicha relación. Ahora se genera el scaffold para editar, eliminar y modificar un registro del tipo consultor con el MVC, el resultado final es el siguiente:

image

El siguiente código es el de la actualización del registro. Al ser esta una aplicación n-layer se crean instancias del poco y se invocan métodos de la lógica de negocios.

image

Ahora vamos a proceder a interactuar con el sitio web para demostrar que pasa con la concurrencia optimista en el Entity Framework. Para hacer bien claros estos pasos, vamos a usar una instancia en FireFox y la otra en Internet Explorer. La primera acción la hacemos en la instancia de Firefox, de donde solicitamos el registro del consultor para modificarlo. Como podemos ver, vamos a cambiarle el nombre al consultor a Luis Diego Rojas Méndez Sonrisa --> o sea yo.

image

Pero antes de que yo haga clic en guardar desde la sesión de internet Explorer solicito el registro para editar y le cambio el nombre de la siguiente forma.

image

Inmediatamente le doy clic a guardar y el cambio se guarda en la base de datos.

image

El problema es que el registro todavía se esta editando en la sesión de Firefox, por lo que cuando se guarda el registro modificado desde este navegador vamos a sobre escribir el valor escrito desde la sesión de IE9.

image

Si editamos el registro desde el IE9 nos vamos a llevar la sorpresa que los cambios hechos en esta sesión ya no están presentes.

image

Como vemos en el ejemplo anterior, el Entity Framework de salida ofrece solamente concurrencia optimista lo cual puede generar problemas en aplicaciones de tránsito muy alto.

En el próximo post vamos a buscar una solución a este problema.

Etiquetas de Technorati: ,

8.06.2011

Tipos Anónimos y Expresiones Lambda

En post pasados hemos hecho consultas utilizando LinqToEntities o LinqToXml y hemos retornado tipos anónimos en cada consulta. En realidad la necesidad de tener un tipo anónimo viene del hecho de que en algunos casos hacemos consultas que dada su estructura se solicitan unos datos de una fuente y otros datos de otra fuente. Por ejemplo, supongamos que tenemos una tabla para Clientes y otra tabla para Órdenes, y queremos hacer una consulta que me devuelva el nombre del cliente, dirección del cliente y el número de cada orden que el cliente posee. En este caso el escenario sería el siguiente:

image

El modelo del EntityFramework para acceder a estas tablas sería el siguiente:

image

Si hacemos la consulta utilizando LinqToEntities esta luciría de la siguiente forma:

image

Como podemos ver, la hacer un join de las dos tablas, no tenemos un tipo que represente el tipo que queremos obtener, por lo tanto debemos crear un tipo anónimo tal y como se ve en la consulta. La pregunta sería: ¿ cómo lograr lo mismo utilizando expresiones Lambda?

La expresión lambda es un poco más abstracta pero nos da el mismo resultado. El código para hacer la consulta anterior con una expresión lambda es el siguiente:

image

Como vemos en el código anterior, utilizamos el método de extensión join y luego le indicamos con que lista de entidades hacer el join, luego sobre cuales campos se hace el join, y por último creamos el tipo anónimo.

Etiquetas de Technorati: ,