2011-10-05 11 views
7

私は、ルールのコレクションを管理するサイトと、データベースのルールに基づいてファイルレベルの変更を行う別のWindowsフォームアプリケーションを持っています。EFコードを強制する方法最初にデータベースにクエリを実行しますか?

これらのアプリケーションはどちらもEFコードファーストDbContextに同じライブラリを使用しますが、各アプリケーションはそれぞれ独自のコンテキストコピーをインスタンス化しています。

問題は、実行中の各バージョンのコンテキストが、他のバージョンの変更を認識しないことです。例えば。サイトのルールを変更すると、フォームアプリには以前のバージョンが残っています。

私はおそらくこの間違った方法について考えており、サイトからフォームアプリケーションへのJSON/REST経由の何らかのデータアクセスを必要としていますが、それ以外の理由ではないことをお勧めします。

コンテキストで「キャッシュを無効にする」方法があり、各クエリがDBにヒットするように強制しますか?

答えて

10

いいえキャッシュを無効にする方法はありません。各問合せを手動で設定してデータをロードする必要があります。この機能はDbContext APIでは使用できません。=> ObjectContext APIを使用する必要があります。

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
ObjectSet<YourEntity> set = objectContext.CreateObjectSet<YourEntity>(); 
set.MergeOption = MergeOption.OverwriteChanges; 
var query = from x in set where ... select x;  

それとも単純なシナリオ:可能な場合は、より良いコンテキスト管理を使用して、代わりに同じ文脈たちの新しい1上のクエリを実行します。

Btw。 winformアプリケーションで公開されたサービスをWebサイトで消費するアイデアは間違っています。 3番目のサービスアプリケーション(WebサーバーまたはWindowsサービスとしてホストされている)が必要で、Webサイトとwinformアプリケーションの両方が新しいアプリケーションを介してデータベースにアクセスします。 EFは新しいアプリケーションでのみ使用されます。

編集:あなたのWinFormアプリケーションがデータベースからロードされたデータに変更を加えていない場合は

あなたもこれを使用することができます。

var query = from x context.YourEntities.AsNoTracking() where ... select x; 

これは、エンティティの内部変更の追跡をオフにし、それはまたべき毎回エンティティをリロードするようEFに強制しますが、変更を保存するのがずっと難しくなります。

+0

私は単純なシナリオが好きです:)私は現在、コンストラクタを介してDIを介してリポジトリを作成しています。私はそれを核にして、必要に応じて新しいコンテキストを生成するためにサービスロケータを使用しなければならないと思いますか? – mattdwen

+0

"YourEntity"に関連する "Users"エンティティがあるとします.MegeOption.OverwriteChangesでリフレッシュされません。また、YourEntity.Usersをリフレッシュする方法についての提案もありますか? –

関連する問題