次の方法で共有


方法: データベース値を維持することで競合を解決する

変更内容を再送信する前に、データベース内の予期した値と実際の値の違いを調整するために、OverwriteCurrentValues を使用することで、データベース内の値を維持できます。 この場合、オブジェクト モデル内の現在の値は上書きされます。 詳しくは、「オプティミスティック コンカレンシー: 概要) の下のステートメントを右クリックします。

Note

どの場合も、データベースから最新のデータを取得することで、まずクライアントのレコードが更新されます。 この処理によって、次の更新処理が同じコンカレンシー チェックで失敗することを防止できます。

このシナリオでは、ユーザー 1 が変更内容を送信しようとしたときに ChangeConflictException 例外がスローされます。途中でユーザー 2 が Assistant 列と Department 列を変更したためです。 次の表は、この状況を示しています。

State 管理者 Assistant Department
ユーザー 1 およびユーザー 2 が照会した最初のデータベース状態 Alfreds Maria Sales
ユーザー 1 が送信しようとした変更内容 Alfred Marketing
ユーザー 2 が既に送信した変更内容 Mary サービス

ユーザー 1 は、この競合を解決するために、新しいデータベース値でオブジェクト モデルの現在の値を上書きすることに決めます。

ユーザー 1 が OverwriteCurrentValues を使用して競合を解決すると、データベース内の結果は次の表のようになります。

State 管理者 Assistant Department
競合解決後の新しい状態 Alfreds

(元の値)
Mary

(ユーザー 2 の値)
サービス

(ユーザー 2 の値)

オブジェクト モデルの現在の値をデータベース値で上書きする方法を次のコード例に示します (個々のメンバーの競合に対する検査やカスタム ハンドリングは行われません)。

Northwnd db = new Northwnd("...");
try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (ChangeConflictException e)
{
    Console.WriteLine(e.Message);
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        // All database values overwrite current values.
        occ.Resolve(RefreshMode.OverwriteCurrentValues);
    }
}
Dim db As New Northwnd("...")

Try
    db.SubmitChanges(ConflictMode.ContinueOnConflict)

Catch ex As ChangeConflictException
    Console.WriteLine(ex.Message)

    For Each occ As ObjectChangeConflict In db.ChangeConflicts
        ' All database values overwrite current values.
        occ.Resolve(Data.Linq.RefreshMode.OverwriteCurrentValues)
    Next

End Try

関連項目