EF 4.1: Version-Stamping

Como seguramente muchos sabréis, la mayoria de los motores de base de datos proveen de un sistema de version-stamping para el marcado de las filas de una tabla. Con este tipo de sistemas, cada vez que se realiza una operación sobre una fila, al estilo de inserción/actualización, la columna marcada para hacer version-stamping se modifica con un valor único, lo cual, nos podría proporcionar un sistema de manejo de concurrencia realmente sencillo ( aunque lógicamente PENALIZANDO EL MODELO al introducir en la entidad un artefacto que nada tiene que ver con ella). En Sql Server, el tipo de datos a utilizar para version-stamping es timestamp ( también conocido por su sinónimo rowversion).  Pues bien, EF 4.1 nos permite el uso de este tipo de datos de una forma realmente sencillo por medio del uso de un atributo o bien por medio del API fluent para el mapeo de entidades.

 

Con el fin de ver un sencillísimo ejemplo partiremos de una entidad definida como podemos ver en el siguiente fragmento de código:

 

Como puede observar, la propidad ( podríamos hacerla privada ) está decorada con el atributo Timestamp y, puesto que el tipo inherente en el caso de Sql Server es un binario ( 8 bytes ) el tipo de datos en .NET es Byte[]. Con esta sencilla decoración, nuestras operaciones de borrado/actualización harán uso de este valor para comprobar si la fila sobre la que estamos actuando ha sido modificada/borrada previamente. En el siguiente fragmento SQL puede ver como sería una actualización sobre la entidad anterior:

 

 

Observe, al igual que con las propiedades identity en las inserciones, después de realizar la operación de actualización se actualiza el valor de esta propiedad establecido automáticamente en la base de datos.

 

Por supuesto ( y como debería ser ) esta anotación puede establecerse directamente en nuestor api fluent, para ello, solamente tendremos que utilizar el método IsRowVersion.

 

 

 

Saludos

unai

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *