Tokens de simultaneidadeConcurrency Tokens

Observação

Esta página documenta como configurar os tokens de simultaneidade.This page documents how to configure concurrency tokens. Ver tratamento de conflitos de simultaneidade para obter uma explicação detalhada de como funciona o controle de simultaneidade no EF Core e exemplos de como lidar com conflitos de simultaneidade em seu aplicativo.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.

As propriedades configuradas como tokens de simultaneidade são usadas para implementar o controle de simultaneidade otimista.Properties configured as concurrency tokens are used to implement optimistic concurrency control.

ConvençõesConventions

Por convenção, as propriedades nunca são configuradas como tokens de simultaneidade.By convention, properties are never configured as concurrency tokens.

Anotações de dadosData Annotations

Você pode usar as anotações de dados para configurar uma propriedade como um token de simultaneidade.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 fluenteFluent API

Você pode usar a API Fluent para configurar uma propriedade como um token de simultaneidade.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; }
}

Versão de linha/carimbo de horaTimestamp/row version

Um carimbo de hora é uma propriedade em que um novo valor é gerado pelo banco de dados sempre que uma linha é inserida ou atualizada.A timestamp is a property where a new value is generated by the database every time a row is inserted or updated. A propriedade também é tratada como um token de simultaneidade.The property is also treated as a concurrency token. Isso garante que você receberá uma exceção se outra pessoa tiver modificado uma linha que você está tentando atualizar, pois consultada para os dados.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.

Como isso é feito é responsabilidade do provedor de banco de dados que está sendo usado.How this is achieved is up to the database provider being used. Para o SQL Server, o carimbo de hora geralmente é usado em uma byte [] propriedade, que será de instalação como um ROWVERSION coluna no banco de dados.For SQL Server, timestamp is usually used on a byte[] property, which will be setup as a ROWVERSION column in the database.

ConvençõesConventions

Por convenção, as propriedades nunca são configuradas como carimbos de hora.By convention, properties are never configured as timestamps.

Anotações de dadosData Annotations

Você pode usar anotações de dados para configurar uma propriedade como um carimbo de hora.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 fluenteFluent API

Você pode usar a API Fluent para configurar uma propriedade como um carimbo de hora.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; }
}