Jetons d'accès concurrentielConcurrency Tokens

Note

Cette page explique comment configurer des jetons d’accès concurrentiel.This page documents how to configure concurrency tokens. Consultez gère les conflits d’accès concurrentiel pour une explication détaillée du fonctionne du contrôle d’accès concurrentiel sur EF principaux et des exemples illustrant comment gérer les conflits d’accès concurrentiel dans votre application.See Handling Concurrency Conflicts for a detailed explanation of how concurrency control works on EF Core and examples of how to handle concurrency conflicts in your application.

Propriétés configurées en tant que jetons d’accès concurrentiel sont utilisées pour implémenter un contrôle d’accès concurrentiel optimiste.Properties configured as concurrency tokens are used to implement optimistic concurrency control.

ConventionsConventions

Par convention, les propriétés ne sont jamais configurées en tant que jetons d’accès concurrentiel.By convention, properties are never configured as concurrency tokens.

Annotations de donnéesData Annotations

Vous pouvez utiliser les Annotations de données pour configurer une propriété comme un jeton d’accès concurrentiel.You can use the Data Annotations to configure a property as a concurrency token.

public class Person
{
    public int PersonId { get; set; }

    [ConcurrencyCheck]
    public string LastName { get; set; }

    public string FirstName { get; set; }
}

API FluentFluent API

Vous pouvez utiliser l’API Fluent pour configurer une propriété comme un jeton d’accès concurrentiel.You can use the Fluent API to configure a property as a concurrency token.

class MyContext : DbContext
{
    public DbSet<Person> People { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .Property(p => p.LastName)
            .IsConcurrencyToken();
    }
}

public class Person
{
    public int PersonId { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

Version de ligne / l’horodatageTimestamp/row version

Un horodatage est une propriété où une nouvelle valeur est générée par la base de données chaque fois qu’une ligne est insérée ou mise à jour.A timestamp is a property where a new value is generated by the database every time a row is inserted or updated. La propriété est également traitée comme un jeton d’accès concurrentiel.The property is also treated as a concurrency token. Ainsi, que vous obtiendrez une exception si un autre utilisateur a modifié une ligne que vous essayez de mettre à jour, car il est interrogée pour les données.This ensures you will get an exception if anyone else has modified a row that you are trying to update since you queried for the data.

Cette opération est le fournisseur de base de données utilisé.How this is achieved is up to the database provider being used. Pour SQL Server, timestamp est généralement utilisé sur un byte [] propriété, qui sera le programme d’installation en tant qu’un ROWVERSION colonne dans la base de données.For SQL Server, timestamp is usually used on a byte[] property, which will be setup as a ROWVERSION column in the database.

ConventionsConventions

Par convention, les propriétés ne sont jamais configurées en tant que les horodatages.By convention, properties are never configured as timestamps.

Annotations de donnéesData Annotations

Vous pouvez utiliser des Annotations de données pour configurer une propriété comme un horodatage.You can use Data Annotations to configure a property as a timestamp.

public class Blog
{
    public int BlogId { get; set; }

    public string Url { get; set; }
    
    [Timestamp]
    public byte[] Timestamp { get; set; }
}

API FluentFluent API

Vous pouvez utiliser l’API Fluent pour configurer une propriété comme un horodatage.You can use the Fluent API to configure a property as a timestamp.

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(p => p.Timestamp)
            .IsRowVersion();
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public byte[] Timestamp { get; set; }
}