0


0

LINQ to SQLを使用していますが、ビューカウンタのクロスコネクトを増やす問題が少しあります。

私が使っている10代のコードは次のとおりです。

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

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

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

これで、行を取得し、フィールドを変更し、行を更新することができました。 ただし、これはChangeConflictExceptionをスローしています。

これのコピーがどれも同時に実行されていないと、なぜ変更が競合するのでしょうか。

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

*編集:*答えを見つけました:

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

  • EDIT2:*上記の私の修正は実際に例外が投げられるのを防いだが、根本的な問題を修正しなかった:

私は複数のデータコンテキストを持っているので、各オブジェクトのキャッシュされたコピーが複数あることになります。 ページを読み込むたびにデータコンテキストを再作成する必要がありますか。

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

1 Answer


2


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

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

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

コンテキストにすべてを忘れるようにすることについてのあなたの最後のコメントに答えるために、私はそれをする方法があるとは思いません、しかし私はコンテキストにあるすべてが追跡された変更(そして接続)であるのであなたが新しいコンテキストを作成すること(古いものを処分することを忘れないでください)は本当にあなたがそのコンテキストであることすべてを捨てたいからです。