Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
/ / /

Asegura la coherencia de los Datos con Concurrencia Optimista

En esta guía, puede aprender cómo utilizar el control de concurrencia optimista con el proveedor de EF Core. El control de concurrencia optimista garantiza que los datos no se sobrescriban entre el momento en que una aplicación los lee y el momento en que la aplicación los escribe nuevamente en la base de datos. El Proveedor EF Core admite dos formas de implementar el control de concurrencia optimista:

  • Tokens de concurrencia, mediante el uso de ConcurrencyCheck atributo o el método API fluido IsConcurrencyToken()

  • Versionado de filas, utilizando el atributo Timestamp o el método de la API fluida IsRowVersion()

Tip

Recomendamos garantizar la concurrencia optimista utilizando solo una de las implementaciones anteriores por entidad.

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; }
[ConcurrencyCheck]
public DateTimeOffset LastModified { get; set; }
}

También puede configurar un token de concurrencia utilizando el método IsConcurrencyToken(). Llama 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 admite la configuración de tokens de concurrencia en cualquier tipo de propiedad compatible con el driver. También puedes establecer múltiples tokens de concurrencia en una sola entidad. Si necesitas actualizar un token de concurrencia, debes hacerlo manualmente.

Puede garantizar la concurrencia optimista utilizando la versión de fila. La versionado de filas permite rastrear cambios en una entidad al especificar un campo de versión que se incrementa automáticamente cuando la entidad cambia. Puede configurar la versión de fila 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; }
[Timestamp]
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 EF Core soporta la versión de filas solo en una propiedad única de una entidad. La propiedad debe ser de tipo long, int, ulong o uint.

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 soportar los mismos mecanismos que usted utiliza para el control optimista de la concurrencia en su aplicación Entity Framework Core.

  • Otras aplicaciones deben soportar comprobaciones para tokens de concurrencia y campos de versión de fila durante cualquier operación de actualización o eliminación.

  • Si utilizas el versionado de filas, otras aplicaciones deben asignar los campos versionados por filas al nombre de la propiedad seguido de la string: _version. La aplicación debe incrementar el valor del campo en 1 por cada actualización.

Para obtener más información sobre el control de concurrencia optimista con Entity Framework Core, consulta Concurrencia optimista en la documentación de Microsoft Entity Framework Core.

Volver

Escritura de datos

En esta página