2012-12-04 13 views
13

EF 5'in sorguları otomatik olarak önbelleğe alacağını, ancak bağlam veya genel olarak bunu gerçekleştirdiğini anlıyorum. MVC kullanıyoruz ve dbcontext'i bertaraf etmek için çağrıları bir blok kullanarak tamamlıyoruz. Örneğin: yeni bir DBContext elde edilecektir çünküVarlık Çerçevesi ile Önbelleğe Alınmış Sorgular 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(); 
     } 
    } 
} 

biz depo üzerinde Find diyoruz dahaki sefere 5 Bu sorgunun önbelleğe alınmış sürümüne sahip EF olacak, ya da gitmiş olacak? Ve eğer önbelleğe alınmış sorguları istiyorsam, bunu halletmem gerekecek mi?

cevap

6

Sorgular genel olarak önbelleğe alınır, böylece her istek için DbContext örneğini güvenli bir şekilde oluşturabilir ve imha edebilirsiniz. Bu benim tercih edilen yaklaşımım zaten.
Microsoft belgeleri bulunabilir here - bkz bölüm 3.2 Sorgulama Planı Önbelleğe Alma. Environment.System

3

: Varsayılan olarak

, sorgu planı önbelleğe alma Varlık SQL sorguları, bir EntityCommand aracılığıyla veya ObjectQuery yoluyla icra edip için etkindir. Ayrıca .NET 4.5 üzerinde Varlık Çerçevede Varlıkları sorgularına LINQ için varsayılan olarak etkin ve Varlık içinde

Framework 6 Ve hayır, sen önbelleğe alma için aynı bağlamda tutunmaya yok edilir iş. Yalnızca sorgunun kendisinin (yani Entity Framework üzerinden derlenen SQL) önbelleğe alınmış olduğunu ve varsayılan olarak bu (önbelleğe alınmış) sorguların her zaman veri istendiğinde DB'ye karşı çalıştırılacağını unutmayın.

+0

Aynı sorgu olduğundan emin olmak için motorun ifadeyi geçmesi gerekiyor mu? –