2012-05-03 24 views
1

これをどのように語るのかよくわかりませんでした。私は、既存のデータベース(自動生成ではない)のリポジトリパターンで最初にかなり標準的なEF 4.1コードを持つASP.NET MVC 3 Webアプリケーションを持っています。 Webアプリケーションが話すデータサービスの下にあるコンテキストがあります。Entity Frameworkはデータベースからのデータ値の変更を更新しません

問題はこれです。つまり、整数の列を持つデータベーステーブルがあるとします。値は10です。データベース自体に入り、テーブルに25を入力すると、ブラウザでリフレッシュした回数に関係なく、ブラウザを閉じて再度開いたり、ブラウザの履歴をクリアしたりしても、値は保持されます私はサイトを再公開する必要があります。

どうしてですか?私は正しいことをここに責めていますか?これはEFの問題ですか? ASP.NETの問題?サーバーの問題? ...私はこれを調べるべきか分からない。

答えて

2

はい、私自身のアプリケーションでこの問題が発生しました。

Entity Frameworkによって追跡される「エンティティ」(オブジェクトインスタンス)はメモリにキャッシュされ、データベースを再クエリーすると更新されません。上書きすると、キャッシュされたバージョンの変更が壊れることがあります。

既存の値を上書きするEFを強制することによってそれを回避する、しかし、あなたが最初にすべての保留中の変更を保存した知っている場合のみ、それを行うように、この、あなたが変更したものを上書きしますので注意してくださいすることができます。

私は仕事をするために、この拡張メソッドを書いている:

public static class DbSetExtensions 
{ 
    public static System.Data.Objects.ObjectSet<T> Uncached<T>(this IObjectContextAdapter context) 
     where T : class 
    { 
     var set = context.ObjectContext.CreateObjectSet<T>(); 
     set.MergeOption = System.Data.Objects.MergeOption.OverwriteChanges; 
     return set; 
    } 
} 

は、だから私が言うことができる、という使用:

var orders = myDbContext.Uncached<Order>().Where(...); 

を...とordersセットがある注文が含まれています以前クエリーされたオブジェクトのプロパティを上書きします。

+0

しかし、どこにキャッシュされていますか?サーバー上で?私は私のブラウザをクリアし、それを閉じて、再び開き、セッションを終了します。どのようにそれはそのように留まるのですか? – quitstalin

+0

@quitstalin DbContext自体によってキャッシュされるため、オブジェクトのライフタイムの管理方法によって異なります。通常、それはセッションごとに行われます。ブラウザがASP.NETコードを実行していないので、あなたのサーバーではそうです。 –

+0

セッションは必ずしも終了するわけではありませんが、ブラウザを閉じてサイトを離れるときにセッションが切断されることはありませんか?私は戻ってきたことをどうやって知っている? – quitstalin

関連する問題