13

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

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リポジトリを呼び出すときに、EF 5にはこのクエリのキャッシュバージョンがありますか、それとも新しいdbcontextを取得するためになくなりますか?また、キャッシュされたクエリが必要な場合、それを処理する必要がありますか?

4

2 に答える 2

6

クエリは全体的にキャッシュされるため、リクエストごとにDbContextインスタンスを安全に作成して破棄できます。これはとにかく私の好ましいアプローチです。
Microsoftのドキュメントはここにあります-セクション3.2クエリプランのキャッシュを参照してください。

于 2012-12-07T10:28:29.580 に答える
3

Microsoftから:

デフォルトでは、クエリプランのキャッシュは、EntityCommandまたはObjectQueryのどちらを介して実行されても、エンティティSQLクエリに対して有効になっています。また、.NET4.5上のEntityFrameworkおよびEntityFramework6のLINQtoEntitiesクエリでもデフォルトで有効になっています。

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

于 2014-07-07T23:58:41.827 に答える