2012-12-04 19 views
13

Rozumiem, że EF 5 automatycznie buforuje zapytania, ale czy robi to w kontekście, czy ogólnie? Używamy MVC i owijamy wywołania w bloku używającym, aby pozbyć się dbcontext. Na przykład:Zapytania buforowane z 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(); 
     } 
    } 
} 

Następnym razem nazywamy Find na repozytorium, będzie EF 5 posiada pamięci podręcznej wersję tego zapytania, czy zostanie on poszedł, bo będziemy uzyskanie nowego dbcontext? A jeśli chcę zapytań z pamięci podręcznej, czy będę musiał to obsłużyć?

Odpowiedz

6

Kwerendy są buforowane ogólnie, dzięki czemu można bezpiecznie tworzyć i usuwać instancję DbContext dla każdego żądania. Takie jest moje preferowane podejście.
Dokumentację Microsoft można znaleźć pod adresem here - patrz sekcja 3.2 Buforowanie planu zapytań.

3

z Microsoft:

Domyślnie plan kwerend włączone jest buforowanie zapytań SQL, Entity czy wykonywanego przez EntityCommand lub przez ObjectQuery. Jest również domyślnie włączona dla zapytań LINQ podmiotom w Entity Framework na .NET 4.5, w Entity Framework 6

I nie, nie trzeba trzymać w tym samym kontekście dla buforowania praca. Zauważ, że tylko samo zapytanie (tj. SQL, który jest kompilowany za pośrednictwem Entity Framework) jest buforowane, i domyślnie to (buforowane) zapytanie będzie nadal uruchamiane przeciwko DB za każdym razem, gdy dane będą żądane.

+0

Czy silnik nadal musi przejść przez wyrażenie, aby upewnić się, że jest to to samo zapytanie? –

Powiązane problemy