同時実行制御トークンConcurrency Tokens

注意

このページは、同時実行制御トークンを構成する方法を説明します。This page documents how to configure concurrency tokens. 参照してください同時実行競合の処理EF Core と、アプリケーションで同時実行の競合を処理する方法の例での同時実行制御のしくみの詳細についてはします。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.

同時実行トークンとして構成されているプロパティは、オプティミスティック同時実行制御を実装するために使用されます。Properties configured as concurrency tokens are used to implement optimistic concurrency control.

規約Conventions

慣例により、プロパティは同時実行トークンとして構成されることはありません。By convention, properties are never configured as concurrency tokens.

データの注釈Data Annotations

データ注釈を使用して、同時実行トークンとしてプロパティを構成することができます。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; }
}

Fluent APIFluent API

Fluent API を使用して、同時実行トークンとしてプロパティを構成することができます。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; }
}

タイムスタンプや行のバージョンTimestamp/row version

タイムスタンプは、行が挿入または更新されるたびにデータベースによってで新しい値が生成された場所のプロパティです。A timestamp is a property where a new value is generated by the database every time a row is inserted or updated. プロパティは、同時実行トークンとしても扱われます。The property is also treated as a concurrency token. これにより、他のユーザー データのクエリを実行するために更新しようとしている行を変更した場合、例外が発生します。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.

これを実現する方法は、使用中のデータベース プロバイダーの責任です。How this is achieved is up to the database provider being used. For SQL Server をタイムスタンプは通常の使用、 byte[] としては、プロパティの設定、 ROWVERSIONデータベース内の列。For SQL Server, timestamp is usually used on a byte[] property, which will be setup as a ROWVERSION column in the database.

規約Conventions

慣例により、プロパティはタイムスタンプとして構成されることはありません。By convention, properties are never configured as timestamps.

データの注釈Data Annotations

データ注釈を使用して、タイムスタンプとしてプロパティを構成することができます。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; }
}

Fluent APIFluent API

タイムスタンプ プロパティを構成するのには、Fluent API を使用できます。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; }
}