2011-12-19 7 views
2

可能な参考文献データ - EntityFramework - SQLのデータベース接続は、私は同様の問題を発見した「リフレッシュ」

ない:Refreshing a SQL database connection解決策を示唆していない(多くのコードをチェックするために)

私の問題に近いはずのLINQ to SQL does not update when data has changed in databaseです。

私は、ユーザーが(SqlConnectionStringBuilder、EntityConnectionStringBuilderと "新EntityClient.EntityConnection(entityconn())" を介して)実行時にたconnectionStringを変更することができるようにセットアップ

私は.OpenとしてとEntityConnectionを使用します」新しいDatabase.DatabaseContainer(entityConnection) "

私は同じコンテナを使用してdbデータを読み込みます。 ".SaveChanges"を呼び出してこれまでのトランザクションを明示的に使用しないでください。 (キャッシュされたデータをコミットする前に変更された場合、私は自動的にコミットし、例外をスロー行うための「SaveChangesメソッドを」期待)

問題の説明

私は2つのプログラムを実行し、1つの、プログラム、相互にデータを変更他のプログラムがコミットする前に接続を確立したときに変更が通知されません。

たとえば、同じプログラム(AとB)を2回使用した場合、次のようになります。 Aを開始し、Bを開始し、A、Bのデータを変更できませんでしたAが変更を完了する前に)。ローカルにキャッシュされたデータをリフレッシュする方法、およびレースの問題に対処する方法を

質問

Aの接続をリフレッシュしてデータを変更すると、Bがリフレッシュされ、データの変更が開始されると、Bは気付かずにAの変更を上書きします。これは、更新後にデータベースが変更されるたびに発生します。上記の2番目の質問は、その問題に対処していないようです。

私はそれを助けることが問題

たぶんコマンド「Container.Refresh(Objects.RefreshMode.StoreWins、エンティティ)を解決することがありますが、私はどのようなオブジェクトわからないどのように私の推測アイデア

キャッシュされたデータベースから読み込んだ旧式のものを提供することができますか?そして、その競合がいつ発生するかはわかりません。

おそらくトランザクションや変更するトランザクションスコープ、トランザクションが開始されてからデータベースに変更がない限り、すべての変更が行われる(または繰り返し試みられる)ことを保証しますか?posですか?アクティブなトランザクションを持つ別のプログラムによって既に変更されたデータを処理する方法はありますか?

答えて

1

あなたが見ているのはidentity mapの動作で、EFの中核的な機能です。あなたは

更新

objectContext.Refresh(RefreshMode.StoreWins, entity); 

entityを使用するか、リフレッシュの問題を解決するために

は、以前あなたがリフレッシュしたいことをしたい、データベースから取得したオブジェクトです。

MergeOption

objectContext.YourEntitySet.MergeOption = MergeOption.OverwriteChanges; 
var data = objectContext.YourEntitySet. 
       /* Any query you want to execute to refresh your data */ 
       ToList(); 

MergeOptionは、データがアイデンティティ・マップに読まれるかの方法を制御します。既定の設定はAppendOnlyで、以前にロードされていないエンティティのみがマテリアライズされますが、既にロードされているエンティティはそのまま残ります。それ以外の場合は、保存されていない状態を上書きできるためです。

2番目の質問は、最初の問題とはまったく関係ありません。他のアプリケーションで変更を準備中にあるアプリケーションがデータを変更することがあると思われる場合は、concurrencyを処理する必要があります。

+0

クイックアンサーに感謝します。今私は私が何を読んでいるかを知っています – Amegon

+0

あなたがリンクしているとき、私は並行性に関する記事を読んで、http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/07/02/10564へのリンクに続きました。 aspxと私のEFモデルで適用されたプロパティ同時性モード=私のタイムスタンプ変数(ほとんどのテーブルで使用される複合型の1つの変数)に固定。 その直後に、以前の「キャッシュされた」データしか持たなかった古い接続であっても、常に最新のタイムスタンプを受信します。私はこれらの問題に対して簡単な解決策があることをとても嬉しく思います。 – Amegon

0

私は、これはEFの状況であなたを助けるが、SqlDependencyを見てみましょうかはわからない:

「SqlDependencyは、ときに、データベースの変更で、元のデータは、そのようご通知を受け取ることができますキャッシュをリフレッシュすることができます。

+0

ありがとう、私はこれも便利だと思います。私はクライアントアプリケーションで作業していますが、おそらく3人以下のユーザーが同時に最大10人を使用するため、データベース変更のイベントハンドラが機能し、変更が発生したときにすぐにデータを更新するように感じるはずです。私はそれがオブザーバーのパターンとレジスタをデータベースに使用していると思います。なぜなら、その構造が最大数のアクティブなクライアントに対してのみ推奨される理由を説明するからです。私はそのことについてさらに読む – Amegon

関連する問題