楽観的な同時実行性によるデータ整合性の確保
Overview
このガイドでは、FS コア プロバイダーでオプティミスティック同時実行制御を使用する方法を学習できます。 楽観的な同時実行制御により、アプリケーションがデータを読み取ってからアプリケーションがデータベースに書き戻すまでの間にデータが上書きされないことが保証されます。 FS コア プロバイダーは、楽観的な同時実行制御を実装するための 2 つの方法をサポートしています。
同時実行トークン(
ConcurrencyCheck
属性またはIsConcurrencyToken()
fluent API メソッドを使用バージョン管理を行うには、
Timestamp
属性またはIsRowVersion()
fluent API メソッドを使用します。
Tip
エンティティごとに前述の実装の 1 つだけを使用して、楽観的な同時実行性を確保することをお勧めします。
同時実行トークン
同時実行トークンを使用することで、指定されたプロパティで楽観的な同時実行性を確保できます。 エンティティをクエリする際、FS コア プロバイダーは同時実行トークンを追跡します。 次に、プロバイダーがSaveChanges()
メソッドまたはSaveChangesAsync()
メソッドを呼び出すと、同時実行トークンの値と データベースに保存されている値を比較し、元の値が変更されていないことを確認します。
クラスを定義するときにConcurrencyCheck
属性を指定することで、同時実行トークンを構成できます。 次の例では、 Customer
クラスのLastModified
プロパティでConcurrencyCheck
属性を指定する方法を示します。
public class Customer { public ObjectId Id { get; set; } public String Name { get; set; } public String Order { get; set; } [ ] public DateTimeOffset LastModified { get; set; } }
また、 IsConcurrencyToken()
メソッドを使用して同時実行トークンを構成することもできます。 次の例に示すように、 DbContext
クラスのOnModelCreating()
メソッドでIsConcurrencyToken()
メソッドを呼び出します。
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Customer>() .Property(p => p.LastModified) .IsConcurrencyToken(); }
TF Core プロバイダーは、ドライバーがサポートする任意のプロパティ型での同時実行トークンの設定をサポートしています。 また、単一のエンティティに複数の同時実行トークンを設定することもできます。 同時実行トークンの更新が必要な場合は、手動で行う必要があります。
行バージョン管理
行バージョン管理を使用すると、楽観的な同時実行性を確保できます。 行バージョン管理では、エンティティが変更されたときに自動的に増加するバージョン フィールドを指定することで、エンティティへの変更を追跡できます。 クラスを定義するときにTimestamp
属性を指定することで、行バージョン管理を構成できます。 次の例では、 Customer
クラスのVersion
プロパティでTimestamp
属性を指定する方法を示します。
public class Customer { public ObjectId Id { get; set; } public String Name { get; set; } public String Order { get; set; } [ ] public long Version { get; set; } }
また、 IsRowVersion()
メソッドを使用して行バージョン管理を構成することもできます。 次の例に示すように、 DbContext
クラスのOnModelCreating()
メソッドでIsRowVersion()
メソッドを呼び出します。
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Customer>() .Property(p => p.Version) .IsRowVersion(); }
FS コア プロバイダーは、エンティティの 1 つのプロパティに対する行バージョン管理のみをサポートします。 プロパティは、 long
、 int
、 ulong
、またはuint
のいずれかである必要があります。
制限
他のアプリケーションとデータを共有するデータベースでオプティミスティック同時実行制御を構成する場合は、次の制限を考慮してください。
他のアプリケーションは、 Entity Framework コア アプリケーション で楽観的な同時実行制御に使用しているのと同じメカニズムをサポートする必要があります。
他のアプリケーションは、アップデートまたは削除操作中に、同時実行トークンと行バージョン フィールドのチェックをサポートする必要があります。
行バージョン管理を使用している場合、他のアプリケーションは、行バージョン フィールドをプロパティの名前とそれに続く string をマッピングする必要があります:
_version
。 アプリケーションは更新ごとにフィールドの値を1ずつ増加させる必要があります。
詳細情報
Entity Framework コアによるオプティミスティック同時同時実行制御の詳細については、 Microsoft Entity Framework コア ドキュメントの オプティミスティック同時実行性 を参照してください。