Overview
En esta guía, aprenderá a usar el control de concurrencia optimista con el proveedor de EF Core. El control de concurrencia optimista garantiza que los datos no se sobrescriban entre la lectura y la escritura en la base de datos. El proveedor de EF Core admite dos maneras de implementar el control de concurrencia optimista:
Tokens de concurrencia, mediante el uso de
ConcurrencyCheckatributo o el método API fluidoIsConcurrencyToken()Control de versiones de filas, mediante el atributo
Timestampo el método de API fluidaIsRowVersion()
Tip
Recomendamos garantizar la concurrencia optimista utilizando solo una de las implementaciones anteriores por entidad.
Tokens de concurrencia
Se puede asegurar la concurrencia optimista en una propiedad específica utilizando un token de concurrencia. Cuando se consulta la entidad, el Proveedor de EF Core rastrea el token de concurrencia. Luego, cuando el proveedor llama al método SaveChanges() o SaveChangesAsync(), se compara el valor del token de concurrencia con el valor guardado en la base de datos para asegurarse de que el valor original no haya cambiado.
Puede configurar un token de concurrencia especificando el atributo ConcurrencyCheck al definir una clase. El siguiente ejemplo muestra cómo especificar el atributo ConcurrencyCheck en la propiedad LastModified de una clase Customer:
public class Customer { public ObjectId Id { get; set; } public String Name { get; set; } public String Order { get; set; } [] public DateTimeOffset LastModified { get; set; } }
También puede configurar un token de concurrencia mediante el método IsConcurrencyToken(). Llame al método IsConcurrencyToken() en el método OnModelCreating() de la clase DbContext, como se muestra en el siguiente ejemplo:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Customer>() .Property(p => p.LastModified) .IsConcurrencyToken(); }
El proveedor de EF Core permite configurar tokens de concurrencia en cualquier tipo de propiedad compatible con el controlador. También puede configurar varios tokens de concurrencia en una sola entidad. Si necesita actualizar un token de concurrencia, debe hacerlo manualmente.
Versiones de filas
Puede garantizar la concurrencia optimista mediante el control de versiones de filas. Este control permite realizar un seguimiento de los cambios en una entidad especificando un campo de versión que se incrementa automáticamente cuando la entidad cambia. Puede configurar el control de versiones de filas especificando el atributo Timestamp al definir una clase. El siguiente ejemplo muestra cómo especificar el atributo Timestamp en la propiedad Version de una clase Customer:
public class Customer { public ObjectId Id { get; set; } public String Name { get; set; } public String Order { get; set; } [] public long Version { get; set; } }
También puedes configurar el control de versiones de filas usando el método IsRowVersion(). Llama al método IsRowVersion() en el método OnModelCreating() de la clase DbContext, como se muestra en el siguiente ejemplo:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Customer>() .Property(p => p.Version) .IsRowVersion(); }
El proveedor principal de EF solo admite el control de versiones de filas en una única propiedad de una entidad. La propiedad debe ser de tipo long, int, ulong o uint.
Limitaciones
Considera las siguientes limitaciones al configurar el control de concurrencia optimista en una base de datos que comparte datos con otras aplicaciones:
Otras aplicaciones deben admitir los mismos mecanismos que utiliza para el control de concurrencia optimista en su aplicación Entity Framework Core.
Otras aplicaciones deben admitir verificaciones de tokens de concurrencia y campos de versión de fila durante cualquier operación de actualización o eliminación.
Si utiliza control de versiones de filas, otras aplicaciones deben asignar los campos con control de versiones de filas al nombre de la propiedad seguido de la cadena
_version. La aplicación debe incrementar el valor del campo en 1 con cada actualización.
Información Adicional
Para obtener más información sobre el control de concurrencia optimista con Entity Framework Core, consulte Concurrencia optimista en la documentación principal de Microsoft Entity Framework.