2012-12-04 20 views
13

EF 5がクエリを自動的にキャッシュすることを理解しましたが、コンテキストまたは全体的にキャッシュを実行しますか?私たちはMVCを使用しており、dbcontextを破棄するためにusingブロックに呼び出しをラップしています。たとえば:Entity Framework 5でキャッシュされたクエリ

public class Employee 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    public int ID {get; set;} 
} 

public class EmployeeQueryByFirstName : IQueryObject<Employee> 
{ 
    private string _firstName; 

    public void Set(string FirstName) 
    { 
     _firstName = FirstName; 
    } 

    public Expression<Func<Employee,bool>> AsExpression() 
    { 
     return (e=>e.FirstName == this._firstName); 
    } 
} 

public class RepoExcerpt 
{ 
    public TEntity Find<TEntity>(IQueryObject<TEntity> queryObject) 
     where TEntity : class 
    { 
     using (var conn = ServiceLocator.IOC.Resolve<IDbContext>()) 
     { 
      var query = (from q in conn.Set<TEntity>() 
         select q); 
      query = query.Where(queryObject.AsExpression()); 
      return query.FirstOrDefault(); 
     } 
    } 
} 

我々は、リポジトリにFindを呼び出して、次回は、5 EFますが、このクエリのキャッシュされたバージョンを持っているか、我々は新しいdbcontextを取得されますので、それが消えてしまいますか?キャッシュされたクエリが必要な場合は、それを処理する必要がありますか?

答えて

6

クエリは全体的にキャッシュされ、各要求に対してDbContextインスタンスを安全に作成して処理することができます。とにかくこれは私の好みのアプローチです。
マイクロソフトのドキュメントはhereです - セクション3.2クエリプランのキャッシュを参照してください。マイクロソフトから

3

:デフォルトでは

、クエリプランのキャッシュはEntityCommandを介して、またはObjectQueryのを介して実行 かどうか、エンティティSQLクエリのために有効になっています。 また、.NET 4.5にエンティティ FrameworkのエンティティクエリにLINQのためにデフォルトで有効になっており、Entity Frameworkの中に6

そして、いや、あなたはへのキャッシュのために同じコンテキスト上に保持する必要はありませんされて作業。クエリ自体(つまり、Entity Frameworkを介してコンパイルされたSQL)のみがキャッシュされ、デフォルトでは、データが要求されるたびにこのキャッシュされたクエリがDBに対して実行されることに注意してください。

+0

エンジンは、同じクエリであることを確認するために式をトラバースする必要がありますか? –

関連する問題