Ich habe eine Frage zur .AsNoTracking()
Erweiterung, da dies alles ziemlich neu und ziemlich verwirrend ist.
Ich verwende einen Kontext pro Anfrage für eine Website.
Viele meiner Entitäten ändern sich nicht und müssen nicht nachverfolgt werden. Ich habe jedoch das folgende Szenario, in dem ich nicht sicher bin, was in die Datenbank gelangt oder ob dies in diesem Fall einen Unterschied macht.
Dieses Beispiel mache ich gerade:
context.Set<User>().AsNoTracking()
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Dies ist das gleiche wie oben, jedoch wird das .AsNoTracking()
aus Schritt 1 entfernt:
context.Set<User>();
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Die Schritte 1 und 2 verwenden denselben Kontext, treten jedoch zu unterschiedlichen Zeiten auf. Was ich nicht herausfinden kann, ist, ob es einen Unterschied gibt. Da es sich bei Schritt 2 um ein Update handelt, werden beide ohnehin zweimal in die Datenbank gelangen.
Kann mir jemand sagen, was der Unterschied ist?
quelle
Siehe diese Seite Entity Framework und AsNoTracking
Was AsNoTracking macht
Entity Framework bietet eine Reihe von Optionen zur Leistungsoptimierung, mit denen Sie die Leistung Ihrer Anwendungen optimieren können. Eine dieser Abstimmungsoptionen ist
.AsNoTracking()
. Mit dieser Optimierung können Sie festlegenEntity Framework
, dass die Ergebnisse einer Abfrage nicht verfolgt werden sollen. Dies bedeutet, dassEntity Framework
keine zusätzliche Verarbeitung oder Speicherung der Entitäten durchgeführt wird, die von der Abfrage zurückgegeben werden. Dies bedeutet jedoch auch, dass Sie diese Entitäten nicht aktualisieren können, ohne sie erneut dem Tracking-Diagramm zuzuordnen.Durch die Verwendung von AsNoTracking können erhebliche Leistungssteigerungen erzielt werden
quelle
Kein Tracking von LINQ zu Entities-Abfragen
Die Verwendung von AsNoTracking () wird empfohlen, wenn Ihre Abfrage für Lesevorgänge vorgesehen ist. In diesen Szenarien erhalten Sie Ihre Entitäten zurück, diese werden jedoch nicht von Ihrem Kontext verfolgt. Dies gewährleistet eine minimale Speichernutzung und eine optimale Leistung
Weitere Infos hier:
Leistungsüberlegungen für Entity Framework
Entity Framework und NoTracking
quelle
Durch Deaktivieren der Nachverfolgung werden Ihre Ergebnismengen auch in den Speicher gestreamt. Dies ist effizienter, wenn Sie mit großen Datenmengen arbeiten und nicht die gesamte Datenmenge auf einmal benötigen.
Verweise:
quelle
Mit AsNoTracking () kann die Anforderung "Eindeutiger Schlüssel pro Datensatz" in EF umgangen werden (in anderen Antworten nicht explizit erwähnt).
Dies ist äußerst hilfreich, wenn Sie eine Ansicht lesen, die keinen eindeutigen Schlüssel unterstützt, da möglicherweise einige Felder nullwertfähig sind oder die Art der Ansicht nicht logisch indizierbar ist.
In diesen Fällen kann der "Schlüssel" auf eine beliebige nicht nullbare Spalte gesetzt werden, aber dann muss AsNoTracking () für jede Abfrage verwendet werden, da sonst Datensätze (nach Schlüssel dupliziert) übersprungen werden.
quelle
Wenn Sie etwas anderes haben, das die Datenbank ändert (z. B. einen anderen Prozess) und sicherstellen müssen, dass Sie diese Änderungen sehen, verwenden Sie
AsNoTracking()
, andernfalls gibt EF Ihnen möglicherweise die letzte Kopie, die Ihr Kontext stattdessen hatte. Daher ist es gut, normalerweise bei jeder Abfrage einen neuen Kontext zu verwenden ::http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/
quelle