12

この質問をどのように表現するかはよくわかりませんが、ここに行きます。複数のクライアント アプリケーションが WCF サービスを介して 1 つのデータ ソースにアクセスするプロジェクトに取り組んでいます。関係ないかもしれませんが、WCF サービスはエンティティ フレームワークを利用してこのデータ ソースにアクセスしています。クライアントが編集のためにレコードを照会したときはいつでも、最初のクライアントが更新を完了するまで、残りのクライアントが同じレコードを編集できないようにしたいと考えています。

間違っている場合は訂正してください。ただし、これは同期および非同期データ アクセスとしても知られていると思います。

私の質問は、この機能を実装するための業界のベスト プラクティスは何かということです。これをデータベース側から (SQL を使用して) 制御する方法はありますか、それともクライアントから行う必要がありますか?

各テーブルにブール値の 'EditMode' 列を含め、編集時に true に設定し、別のクライアントがそのレコードにアクセスできるようにする前に true に設定されているかどうかを確認することを検討しました。

4

1 に答える 1

9

ベスト プラクティスは、RowVersion と楽観的ロックを使用することです。

オプティミスティック コンカレンシー パターンの説明。

最初にコードを使用する場合は、POCO にフィールドを含めます。

public virtual byte[] RowVersion { get; set; }

EF は Timestamp/RowVersion プロパティをテーブルに追加します。アップデート時にチェックされます。また、変更時に DB によって自動的に更新されます。

編集:よりよく説明するために。

EF が探しているのは、コンカレンシー フィールドであるプロパティです。これにより、1 つ以上のフィールドでコンカレンシーを実際に制御できます。

entity.Property(p => p.RowVersion).IsConcurrencyToken()

更新または削除を実行するときに、定義された例外をキャッチします

catch (DbUpdateConcurrencyException ex)

EF は、RowVersion をコンカレンシー トークンとして扱います。これは、一般的に使用されるアプローチです。SQLServer はこのフィールド タイプを自動的に更新するためです。とても速くて簡単です。ただし、プロパティが明示的に同時実行トークンであり、複数のプロパティがあることを EF に伝えることができます。

そのため、EF は、アクセス後にレコードが変更されていないことを確認するために、更新と削除の where 句にプロパティを追加する必要があります。

于 2013-02-05T23:36:34.433 に答える