Entity Framework
Tracking vs. No-Tracking
Suche…
Bemerkungen
Mit dem Verfolgungsverhalten wird gesteuert, ob Entity Framework Informationen zu einer Entitätsinstanz in seinem Änderungs-Tracker speichert. Wenn eine Entität verfolgt wird, werden alle in der Entität festgestellten Änderungen während SaveChanges() in der Datenbank SaveChanges() .
Abfragen verfolgen
- Abfragen, die Entitätstypen zurückgeben, werden standardmäßig verfolgt
- Das bedeutet, dass Sie Änderungen an diesen Entitätsinstanzen vornehmen können und diese Änderungen durch
SaveChanges()
Beispiel:
- Die Änderung des
bookBewertung wird nachgewiesen werden , und beharrte auf die Datenbank währendSaveChanges().
using (var context = new BookContext())
{
var book = context.Books.FirstOrDefault(b => b.BookId == 1);
book.Rating = 5;
context.SaveChanges();
}
No-Tracking-Abfragen
- Keine Verfolgungsabfragen sind nützlich, wenn die Ergebnisse in einem
read-onlySzenario verwendet werden - Sie sind
quicker to executeda keine Änderungsnachverfolgungsinformationen eingerichtet werden müssen
Beispiel:
using (var context = new BookContext())
{
var books = context.Books.AsNoTracking().ToList();
}
Mit EF Core 1.0 können Sie auch das Standardverfolgungsverhalten auf context instance ändern.
Beispiel:
using (var context = new BookContext())
{
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var books = context.Books.ToList();
}
Tracking und Projektionen
- Auch wenn der Ergebnistyp der Abfrage kein Entitätstyp ist, wird das Ergebnis, wenn
contains entitytracked by defaultweiterhintracked by default
Beispiel:
In der folgenden Abfrage, die einen
anonymous typezurückgibt, werden die Instanzen vonBookin der Ergebnismengewill be trackedusing (var context = new BookContext()) { var book = context.Books.Select(b => new { Book = b, Authors = b.Authors.Count() }); }Wenn die Ergebnismenge
does notkeine enthaltenentity- Typen, dannno trackingdurchgeführt
Beispiel:
In der folgenden Abfrage, die einen
anonymous typemit einigen Werten der Entität zurückgibt (jedochno instancesdes tatsächlichenentity), wird keine Nachverfolgung durchgeführt.using (var context = new BookContext()) { var book = context.Books.Select(b => new { Id = b.BookId, PublishedDate = b.Date }); }