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

注意

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