質問: db.ClientConfig.FromCache(DateTime.Now.AddMinutes(60)).ToList(); return string.Join("\n", clientConfig.Select(b => b.Name + "=" + b.Value)); } return null; } ``` > **編集2:キャッシングは機能しませんが、新しいコンテキストインスタンスを作成するため、データベースへの接続が作成されます。しかし、問題があります!私はWebサービスでEFリクエストを行います。 Webサービスのホスト名に応じてHost: - ヘッダ別のデータベースが照会されます。 EF Plusはこれを処理していないようですので、 http:// host1 / clientConfigを使用すると、後でhttp:// host2 / clientConfigから同じ結果と誤った結果が得られます 。キャッシュにホスト名をタグ付けする方法はありますか?** > >
回答: **免責事項** :私はプロジェクトのオーナーですEntity Framework Plus(EF +) すでに調査した他の図書館については話すことができませんが、EF + Query Cacheでは特定の期間データをキャッシュできます。 Wiki: EF +クエリキャッシュ *例* ``` using (var db = new MyEF6Entities()) { var path = db.Configuration.Where(c => c.name="Path") .FromCache(DateTime.Now.AddMinutes(60)); var onlineUserList = db.Users.Where(u => u.IsOnline) .FromCache(DateTime.Now.AddSeconds(30)); } ``` キャッシュの「タグ」を使用して、あるロジックでデータが必要で、他のロジックでは必要ない場合は、データを複数回キャッシュすることもできます。 *例* ``` using (var db = new MyEF6Entities()) { var recentUserList = db.Users.Where(u => u.IsOnline) .FromCache(DateTime.Now.AddHours(1), "recent"); var onlineUserList = db.Users.Where(u => u.IsOnline) .FromCache(DateTime.Now.AddSeconds(30), "online"); } ``` 私の知るところでは、キャッシュサポートは最後のX秒間にキャッシュされたデータを取っているとは思わない。 **編集** :サブ質問に答える > ありがとうジョナサン。 EF +は、例えば、異なるデータベースを使用してどのように動作し、異なるログインユーザなどをどのように使用しますか。これを自動的に処理するのか、それとも何かヒントを与える必要がありますか? > > それは各機能によって異なります。たとえば、LINQのみがフードの下で使用されるため、Query Cacheはすべてのデータベースプロバイダで機能します。何も指定する必要はありません。すでにすべてを処理しています。 Query Futureのようないくつかの機能は、すべてのプロバイダでまだ機能していません。 SQL Server、SQL Azure、MySQLなどの人気のあるプロバイダで動作します。 各機能の下の要件セクションが表示されます。すべてのプロバイダをサポートしている場合は、通常、「すべてサポートされています」と言います。 **編集** :サブ質問に答える > MyEF6Entitiesコンストラクタのデータベースを変更して、EF +がデータベース名を考慮に入れるかどうか、またはこれがキャッシュを台無しにするかどうかを質問します。 > > v1.3.34から、接続文字列がキーの一部になりました。それがこのシナリオをサポートします。 キーは以下から構成されます: * キャッシュプレフィックス * 接続文字列 * すべてのキャッシュタグ * すべてのパラメータ名と値 > キャッシュにホスト名をタグ付けする方法はありますか > > キャッシュタグを使用することができます: EF +クエリキャッシュタグ&ExpireTag 例: ``` var host1 = "http://host1/ClientConfig"; var host2 = "http://host2/ClientConfig"; var clientHost1 = db.ClientConfig.FromCache(DateTime.Now.AddMinutes(60), host1).ToList(); var clientHost1 = db.ClientConfig.FromCache(DateTime.Now.AddMinutes(60), host2).ToList(); ``` すべてのタグはキャッシュキーの一部であるため、両方のクエリは異なるキャッシュエントリにキャッシュされます。 **編集** :サブ質問に答える > 私は、MyString6()コンストラクタでConnectionStringを設定し、それはまだ異なるデータベースからのデータを混乱させるようです > > キャッシュキーを生成し、接続文字列が含まれているかどうかを確認できますか? ``` var query = b.Users.Where(u => u.IsOnline); var cacheKey = QueryCacheManager.GetCacheKey(query, new string[0]); ``` > それは私が例えばvar clientHost = db.ClientConfig.FromCache(DateTime.Now.AddMinutes(60)、hostName).ToList();私は接続文字列が異なるので、これをする必要はありませんか? > > はい、あなたは正しいです。ホストとの接続文字列が変更されている場合は、その必要はありません。