0

私は LINQ to SQL を使用しており、ビュー カウンターの相互接続をインクリメントする際に少し問題があります。

私が使用している小さなコードは次のとおりです。

t = this.AppManager.ForumManager.GetThread(id);
t.Views = t.Views + 1;
this.AppManager.DB.SubmitChanges();

現在、私のテストでは、これを複数回、非同時に実行しています。このテストを実行するオブジェクトのコピーは合計 4 つあります。

つまり、ロックの問題などはありませんが、4 つのデータ コンテキストがあります。

さて、私はこれが次のように機能することを期待しています: 行をフェッチし、フィールドを変更し、行を更新します。ただし、これは ChangeConflictException をスローしています。

これのコピーが同時に実行されていない場合、変更が競合するのはなぜですか?

特定のテーブルで変更の競合を無視する方法はありますか?

編集:答えが見つかりました:

テーブルのすべての列に "UpdateCheck = Never" を設定して、後攻スタイルの更新を作成できます。これは、LINQ に移植する前にアプリケーションが使用していたものであるため、ここではそれを使用します。

EDIT2:上記の私の修正は実際に例外がスローされるのを防ぎましたが、根本的な問題は修正されませんでした:

複数のデータ コンテキストがあるため、各オブジェクトの複数のキャッシュ コピーが存在することになります。ページが読み込まれるたびにデータ コンテキストを再作成する必要がありますか?

むしろ、すべてを忘れるようにデータ コンテキストに指示したいと思います。これは可能ですか?

4

1 に答える 1

2

DataContext は、比較的軽量で短命になるようにインデントされていると思います。IMO、DataContext でロードされたデータを必要以上に長くキャッシュしないでください。(私が理解しているように) DataContext のメモリ使用量は主に、DataContext によって管理される (取得される) オブジェクトに加えた変更の追跡に関連しているため、短命の場合は比較的小さいままです。

私が取り組んでいるアプリケーションでは、コンテキストを作成し、UI にデータを表示し、ユーザーの更新を待ってからデータを更新します。ただし、これが必要なのは主に、ユーザーが見ているものに基づいて更新を行うためです (そうしないと、ユーザーが更新を押したときに、データを取得して一度に更新することができます)。更新が比較的独立している場合は、更新する直前に行を取得するのが賢明だと思います。

System.Data.Linq.DataContext.Refresh() を使用して、既に取得したデータをデータベース内のデータと再同期して、この問題を解決することもできます。

コンテキストにすべてを忘れさせることについての最後のコメントに答えるには、それを行う方法はないと思いますが、コンテキストにあるのは追跡された変更(および接続)だけであり、それは同じであるためだと思います新しいコンテキストを作成することを忘れないでください (古いものを破棄することを忘れないでください)。実際には、コンテキストのすべてを破棄したいからです。

于 2009-06-20T12:39:44.993 に答える