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:

 

public class Customer
{
   public int CustomerId { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }

   [Timestamp()]
   public byte[] RowVersion { get; set; }

}

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:

 

 

exec sp_executesql N'update [dbo].[Customers]
set [FirstName] = @0
where (([CustomerId] = @1) and ([RowVersion] = @2))
select [RowVersion]
from [dbo].[Customers]
where @@ROWCOUNT > 0 and [CustomerId] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8)',@0=N'unai',@1=1,@2=0x00000000000007D2

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.

 

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Customer>()
               .Property(p => p.RowVersion)
               .IsRowVersion();
}

 

 

Saludos

unai

Published 13/4/2011 1:08 por Unai
Comparte este post:
http://geeks.ms/blogs/unai/archive/2011/04/13/ef-4-1-version-stamping.aspx