2016-07-27 13 views
1

私はEntityFramework 6(ADO)のレコードを見つけてから、再度そのレコードを検索しようとした場合には、Findメソッドは、ここに0を返します。例を示しますEntityFramework 6:以前に見つかったレコードを見つけるにはどうすればよいですか?

var db3 = new IMS(); 

db3.TabModuleSettings.Find(973, "ShowSoldOut"); //Local.Count=1 
db3.TabModuleSettings.Local.Clear(); //Local.Count=0 

db3.TabModuleSettings.Find(142, "AllowIndex"); //Local.Count=1 
db3.TabModuleSettings.Local.Clear(); //Local.Count=0 

db3.TabModuleSettings.Find(973, "ShowSoldOut"); //Local.Count=0 
db3.TabModuleSettings.Local.Clear(); //Local.Count=0 

db3.TabModuleSettings.Find(142, "AllowIndex"); //Local.Count=0 

がどのように私は、以前に記録した見つけるのですか?心に留めておくべき

答えて

4

2つのこと:あなたがLocal.Clear()を行う場合

  • Localコレクション内のエンティティが削除対象としてマークされています。したがって、キー値が(973, "ShowSoldOut")のエンティティはコンテキストのキャッシュにまだ存在しますが、状態はDeletedです。 (後で(142, "AllowIndex")と同じもの)。

  • DbSet.Findは、コンテキストのキャッシュ内のエンティティを最初に探して、見つからなければデータベースを検索します。エンティティがキャッシュ内に見つかったが削除された場合、エンティティはもう存在してはいけないと判断し、それを返しません。

私はなぜあなたがこれらの呼び出しを行うのか分かりませんが、気にして使うことが今のところわかったと思います。

キャッシュをクリアするための正しい方法は、1つのLocal収集のために、たとえば、エンティティを取り外すことにより、次のとおりです。

foreach (var x in db3.TabModuleSettings.Local.ToList()) 
{ 
    Entry(x).State = System.Data.Entity.EntityState.Detached; 
} 

(これは削除されたエンティティをデタッチしないだろうが)。

または全体のキャッシュ:

foreach (var entry in db3.ChangeTracker.Entries()) 
{ 
    entry.State = System.Data.Entity.EntityState.Detached; 
} 

(も削除するエンティティを外します)。

または(削除を含む)は、特定のタイプのすべてのエンティティ:

foreach (var entry in db3.ChangeTracker.Entries<TabModuleSetting>()) 
{ 
    entry.State = System.Data.Entity.EntityState.Detached; 
} 

通常、あなたはこれを行う必要はありませんが。エンティティをリフレッシュする場合は、通常はコンテキストを破棄して新しいものを作成する方がよいでしょう。

+0

キャッシュルックアップではなく、データベースルックアップを強制するにはどうすればよいですか?または、キャッシュを空にするにはどうすればよいですか? .Clearは結果セットを空にすることを意図していました。 .Findステートメントの間にはかなりのことが起こります。 – Chris

+0

さらに詳しい情報を追加しました。 –

+0

OK。私は、IMSクラスの廃棄と再初期化でパフォーマンスが低下すると考えました。初めて、約15秒かかります。しかし、 db3.Dispose()db3 = new IMS()はパフォーマンスの問題を引き起こすようではなく、処理が必要なものを処理します。 – Chris

0

Alrighty。私がする必要があったのはこれでした:

db3.TabModuleSettings =新しいIMS()。TabModuleSettings;

これだけです。

+0

私はそれが私の答えの最後の行で言ったことだと思います。そして、私はあなたの最初のアプローチの問題点についても説明します。 –

+0

。あんまり。あなたは、文脈全体を破棄し、存在するかもしれない他の実体を失うように指示しました。私はまだ私の以前の発見のいくつかを保つ必要があります。私のやり方では、私は選択したエンティティを廃棄するだけです。db3は私の全体の文脈であり、私は文脈全体を失いたくはありません。 – Chris

+0

ああ、それはあなたがしていることですか?私はそれに強くアドバイスしたいと思います。コンテキストのチェンジトラッカーに以前のセット内のエンティティの情報が含まれている間に、DbSet全体を置き換えます。これは起こるのを待っている奇妙なバグの全範囲です。選択したエンティティを削除すると、取り除くエンティティをデタッチする必要があります。内部的には、EFは変更トラッカー(およびリレーションシップ・マネージャー)を同期させて保持します。私はそのシナリオを含める答えを改訂しました。 –

関連する問題