2011-12-21 6 views
0

以前にデータのリポジトリ呼び出しを行ったときに、dbの変更に反映されていないことは一度もありませんでした。しかし、これは今起こっているようです。Entity Frameworkを使用してリポジトリ呼び出しを確実にキャッシュする方法はありますか?

これまで、リポジトリの呼び出しは常に、リポジトリのi/fがサービス/コントローラのコンストラクタに挿入されているリポジトリパターンを使用するというコンテキストで行われていました。

私はコンソールアプリケーションとして書かれた電子メールタスクを持っており、while()ループを含んでいます。これは、電子メールアカウントのデータベースに問い合わせを行い、それぞれのサーバーから電子メールをダウンロードします。問題は、_emailSettingsRepo.GetAll()メソッドを呼び出すたびに、すべての設定が古いため、管理スタジオで変更が反映されていてもデータベースは変更されません。これは、ループ内で同じリポジトリを使用して同じdbコンテキストを使用しているため、GetAll()メソッド呼び出しを変更しても差がないためです。

これは、新しい要求がコントローラに到着するたびにrepoとdbコンテキストが再作成されるため、キャッシングがこれまで問題になることはありませんでしたか?この問題をどのように解決するのですか?

答えて

1

あなたがそれを必要とするとき、コンテキストを作成して、その後のようなもの、それを処分:コンテキスト管理に関するウェブアプリで、このアプリのコンソールを比較

while (true) 
{ 
    using (var context = new MyContext()) 
    { 
     _emailSettingsRepo = new EmailSettingsRepo(context); 
     var all = _emailSettingsRepo.GetAll(); 

     // Process all 
    } 
    // context gets disposed here, 
    // garbage collection removes objects from context ("cache"), 
    // next run creates new "empty" context 

    bool cancelled = WaitAnHourOrCancel(); 
    if (cancelled) 
     break; 
} 

を、すべてのループを実行するにはWebリクエストであると思います。あなたのWebアプリケーション(例えばNinject)でIOCコンテナを使用している場合、コンテナがコンテキストを作成し、それを処理する可能性が十分にあります。しかし、それは常にcontext = new MyContext()context.Dispose()のペアであり、その間のリクエスト処理です。したがって、基本的には上記の例のusingブロックのようになります。あなたはただあなたのコンソールアプリで明示的にこれを行う必要があります。

関連する問題