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
book
Bewertung 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-only
Szenario verwendet werden - Sie sind
quicker to execute
da 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 entity
tracked by default
weiterhintracked by default
Beispiel:
In der folgenden Abfrage, die einen
anonymous type
zurückgibt, werden die Instanzen vonBook
in der Ergebnismengewill be tracked
using (var context = new BookContext()) { var book = context.Books.Select(b => new { Book = b, Authors = b.Authors.Count() }); }
Wenn die Ergebnismenge
does not
keine enthaltenentity
- Typen, dannno tracking
durchgeführt
Beispiel:
In der folgenden Abfrage, die einen
anonymous type
mit einigen Werten der Entität zurückgibt (jedochno instances
des 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 }); }