2

したがって、これは私がまだ答えを見つけることができなかった非常に単純な質問です. したがって、状況は次のとおりです。

  • User1 は objectcontext を初期化します
  • User2 は、同じタイプの別の objectcontext を初期化します
  • User1 がエンティティ A を変更する
  • User2 がエンティティ B を変更する
  • User2 が変更を保存
  • User1 は RefreshMode.ClientWins で更新を行い、変更の保存に進みます

では、エンティティ B はどうなるでしょうか。User1 は変更していませんが、データベースのバージョンとは異なります。私の直感では、User1 はエンティティ B に変更を加えていないため、User2 が残した状態のままであると言えます。でもよくわからないので詳しい方にお聞きします。

4

2 に答える 2

3

RefreshMode.ClientWinsローカルの変更が保持されるかどうかにのみ影響します。RefreshMode.ClientWinsローカルな変更がない場合、 と の間に違いはありませんRefreshMode.StoreWins

ドキュメントが少し混乱していることがわかります。

StoreWins モードは、データ ソースの値と一致するようにオブジェクトを更新する必要があることを意味します。ClientWins 値は、データ ソースに他の変更があった場合でも、オブジェクト コンテキストの変更のみが保持されることを意味します。

オブジェクト コンテキストの非変更は で永続RefreshMode.ClientWins化されませんが、ドキュメントには明確に記載されていません。

于 2012-05-15T08:00:56.120 に答える
2

あなたの予想は正しいです。データベースに変更がなく、更新が何も行わなかったため、エンティティ B には何も起こりません。

オブジェクト コンテキストは、追跡対象のエンティティごとに 2 セットの値 (元の値と現在の値) を内部的に追跡します。元の値はデータベースからロードされた値であり、現在の値はエンティティのロード後にアプリケーションによって変更された実際の値です。

モードで呼び出すRefreshClientWins、コンテキストはエンティティのデータベースをクエリし、エンティティの追跡レコード内のすべての元の値を更新し、アプリケーションによってまだ変更されていない現在の値を更新します。既に変更されている値は更新されません (つまり、クライアントが更新を獲得します)。

EFを実行するSaveChangesと、元の値と現在の値を比較して変更を検出し、変更された列に対してのみ更新コマンドを作成します。ClientWins更新モードは、オプティミスティック同時実行のシナリオで使用され、データベースの変更を新しい値で強制的に上書きします。

于 2012-05-15T08:07:32.397 に答える