2012-12-04 17 views
13

Ich verstehe, dass EF 5 die Abfragen automatisch zwischenspeichert, aber macht es das pro Kontext oder insgesamt? Wir verwenden MVC und wickeln die Aufrufe in einem using-Block ab, um den dbcontext zu entfernen. Zum Beispiel:Zwischengespeicherte Abfragen mit 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(); 
     } 
    } 
} 

Das nächste Mal, wenn wir Find auf dem Repository aufrufen, wird EF 5 eine im Cache gespeicherte Version dieser Abfrage, oder wird es verschwunden sein, weil wir ein neues DbContext bekommen wird? Und wenn ich zwischengespeicherte Abfragen möchte, muss ich damit umgehen?

Antwort

6

Die Abfragen werden insgesamt zwischengespeichert, sodass Sie die DbContext-Instanz für jede Anforderung sicher erstellen und löschen können. Das ist meine bevorzugte Vorgehensweise.
Microsoft Dokumentation finden Sie here - siehe Abschnitt 3.2 Abfrage Plan Caching.

3

Von Microsoft:

standardmäßig Abfrage-Plan-Caching für Entity SQL-Abfragen aktiviert ist, ob durch eine EntityCommand ausgeführt oder durch einen Object. Es ist auch standardmäßig für LINQ to Entities-Abfragen in Entity Framework auf .NET 4.5 und in Entity Framework 6

aktiviert Und nein, Sie müssen nicht auf den gleichen Kontext für das Caching halten Arbeit. Beachten Sie, dass nur die Abfrage selbst (d. H. Die SQL, die über das Entity Framework kompiliert wird) zwischengespeichert wird. Diese (zwischengespeicherte) Abfrage wird standardmäßig immer dann für die DB ausgeführt, wenn die Daten angefordert werden.

+0

Muss die Engine den Ausdruck noch durchlaufen, um sicherzustellen, dass es sich um dieselbe Abfrage handelt? –

Verwandte Themen