0

My Entity Frameworkでサポートされているプロジェクトは、エンティティ全体を選択すると古いデータを返しますが、エンティティからフィールドのみを選択するとデータは最新です。

手順は次のとおりです。

  1. EF / LINQを介したクエリ:

    var e  = context.myEntity.First(x=>x.ID==ID);
    string n = context.myEntity.Where(x=>x.ID==ID).Select(x=>x.Name).First();
    
  2. SQLを介してDBの[名前]フィールドを直接更新します

  3. 次に、EF/LINQを介して再度クエリを実行します。

    var e  = context.myEntity.First(x=>x.ID==ID);
    string n = context.myEntity.Where(x=>x.ID==ID).Select(x=>x.Name).First();
    

e.Nameは以前の値ですが、n最新です。

呼び出し間で同じコンテキストを再利用しています。

SQLプロファイラーを使用すると、データが古くなっている場合でも、EFからのSQLクエリが発生することを確認できます。

これを引き起こす原因は何ですか?

4

2 に答える 2

2

データはコンテキストにキャッシュされます。理想的には、この動作が問題になるのを防ぐために、コンテキストの存続期間を短くする必要があります(たとえば、作業単位)。ただし、データベースからの更新を強制する必要がある場合は、MergeOptionをOverwriteChangesに設定します。

context.MergeOption = MergeOption.OverwriteChanges
于 2012-08-02T19:03:52.737 に答える
1

これは、デフォルトのコンテキスト マージ オプションを使用しているためですMergeOption.AppendOnly。このオプションは基本的に、基になるコンテキスト構造に、既存のエンティティをデータソース クエリからの新しい値で置き換えないように指示します。

他のオプションもありますが、以下を読んで、他のオプションのいずれかが希望するシナリオにより適しているかどうかを確認することをお勧めします.

http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx

あなたの最良の選択肢のように思えますMergeOption.PreserveChanges

于 2012-08-02T19:10:11.867 に答える