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

プロパティが、同時実行トークンとして構成されている場合 EF は、その他のユーザーが変更なし、データベース内でその値そのレコードに変更を保存するときにでチェックされます。If a property is configured as a concurrency token then EF will check that no other user has modified that value in the database when saving changes to that record. EF オプティミスティック同時実行パターンを使用して、つまりは値が変更されていないと想定して、データの保存が、値が変更されたが見つかった場合にスローしようとしています。 します。EF uses an optimistic concurrency pattern, meaning it will assume the value has not changed and try to save the data, but throw if it finds the value has been changed.

構成することがありますたとえばLastNamePerson同時実行トークンであります。For example we may want to configure LastName on Person to be a concurrency token. つまり、1 人のユーザーは、いくつかの変更を保存しようとした場合、 Person、別のユーザーが変更されて、LastNameし、例外がスローされます。This means that if one user tries to save some changes to a Person, but another user has changed the LastName then an exception will be thrown. アプリケーションがこのレコードが、変更を保存する前にも同じの実際のユーザーを表すことを確認するユーザーの入力を求めるように必要があります。This may be desirable so that your application can prompt the user to ensure this record still represents the same actual person before saving their changes.

注意

このページは、同時実行トークンを構成する方法を説明します。This page documents how to configure concurrency tokens. 参照してください同時実行の処理アプリケーションでオプティミスティック同時実行制御を使用する方法の例についてはします。See Handling Concurrency for examples of how to use optimistic concurrency in your application.

EF での同時実行トークンのしくみHow concurrency tokens work in EF

データ ストアは、同時実行トークンを更新またはまだ削除されているすべてのレコードが最初、コンテキストはデータベースからデータを読み込むときに割り当てられた同時実行トークンに同じ値を持つことを確認して適用できます。Data stores can enforce concurrency tokens by checking that any record being updated or deleted still has the same value for the concurrency token that was assigned when the context originally loaded the data from the database.

たとえば、リレーショナル データベースこれを実現するで同時実行トークンを含めることによって、WHEREいずれかの句UPDATEまたはDELETEコマンドとその影響を受けた行の番号を確認します。For example, relational databases achieve this by including the concurrency token in the WHERE clause of any UPDATE or DELETE commands and checking the number of rows that were affected. 同時実行トークンがまだと一致する場合は、1 つの行が更新されます。If the concurrency token still matches then one row will be updated. データベース内の値が変更された場合、行は更新されません。If the value in the database has changed, then no rows are updated.

UPDATE [Person] SET [FirstName] = @p1
WHERE [PersonId] = @p0 AND [LastName] = @p2;

規則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; }
}