Welchen Unterschied macht .AsNoTracking ()?
Ich habe eine Frage bezüglich der .AsNoTracking()
Erweiterung, das ist alles ganz neu und sehr verwirrend.
Ich bin mit einem pro-request-Kontext für eine website.
Viele meiner Einheiten nicht ändern, also nicht nachverfolgt werden müssen, aber ich habe Folgendes Szenario wo ich bin mir nicht sicher, was Los ist auf der Datenbank, oder sogar ob es einen Unterschied macht in diesem Fall.
Diesem Beispiel ist, was ich bin derzeit dabei:
context.Set<User>().AsNoTracking()
//Step 1) Get user
context.Set<User>()
//Step 2) Update user
Dies ist die gleiche wie oben, aber das entfernen der .AsNoTracking()
aus Schritt 1:
context.Set<User>();
//Step 1) Get user
context.Set<User>()
//Step 2) Update user
Die Schritte 1 & 2 verwenden Sie den gleichen Kontext, aber zu verschiedenen Zeiten auftreten. Was ich kann nicht herausfinden, ob es da Unterschiede gibt. Schritt 2 ist ein update, ich vermute, dass beide Treffer der Datenbank doppelt sowieso.
Kann mir jemand sagen, was der Unterschied ist?
InformationsquelleAutor der Frage dotnetnoob | 2012-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Unterschied ist, dass im ersten Fall die abgerufenen Benutzer nicht verfolgt werden, durch den Kontext, so dass, wenn Sie gehen, um den Benutzer zu speichern zurück zur Datenbank müssen Sie befestigen, und richtig einstellen Zustand des Benutzers, so dass EF weiß, dass Sie sollten aktualisieren Sie vorhandene Benutzer anstelle von einfügen einer neuen. Im zweiten Fall brauchen Sie nicht zu tun, wenn Sie das laden und speichern der Benutzer mit der gleichen Kontext-Instanz, da der tracking-Mechanismus behandelt, die für Sie.
InformationsquelleAutor der Antwort Ladislav Mrnka
finden Sie auf dieser Seite Entity Framework und AsNoTracking
Was AsNoTracking Tut
Entity Framework stellt eine Reihe von performance-tuning-Optionen, um Ihnen helfen, optimieren Sie die Leistung Ihrer Anwendungen. Eines dieser tuning-Optionen ist
.AsNoTracking()
. Diese Optimierung ermöglicht es Ihnen zu sagenEntity Framework
nicht verfolgen, die Ergebnisse einer Abfrage. Dies bedeutet, dassEntity Framework
führt keine weitere Verarbeitung oder Speicherung der Entitäten, die von der Abfrage zurückgegeben werden. Es bedeutet aber auch, dass Sie nicht aktualisieren, werden diese Personen ohne anfügen Sie an den tracking-graph.gibt es erhebliche performance-Gewinne durch die Verwendung AsNoTracking
InformationsquelleAutor der Antwort Moji
Keine Tracking-LINQ to Entities-Abfragen
Nutzung des NoTracking() ist empfohlen, wenn Ihre Abfrage ist gedacht für lese-Operationen. In diesen Szenarien erhalten Sie zurück Ihre Einheiten, aber Sie werden nicht verfolgt, die von Ihrem Kontext.Dies sorgt für minimale memory-Nutzung und die optimale Leistung
Mehr info finden Sie hier:
Performance-überlegungen für Entity Framework
Entity Framework und NoTracking
InformationsquelleAutor der Antwort NullReference
Deaktivieren von tracking wird auch dazu führen, Ihr Ergebnis stellt das streamen in den Speicher. Dies ist effizienter, wenn Sie arbeiten mit großen Datenmengen und brauchen nicht die gesamte Datenmenge auf einmal.
Referenzen:
InformationsquelleAutor der Antwort Ronnie Overby
AsNoTracking() ermöglicht es, den "einzigartigen Schlüssel pro record" - Anforderung in EF umgangen werden kann (nicht explizit erwähnt, durch die anderen Antworten).
Dies ist äußerst hilfreich beim Lesen eine Ansicht, die nicht die Unterstützung einer eindeutigen Schlüssel, weil vielleicht einige Felder null-Werte zulassen oder die Natur der Ansicht ist logisch nicht indizierbar.
Für diese Fälle ist der "Schlüssel" kann eingestellt werden, um alle nicht-null-Spalte, doch dann AsNoTracking() muss verwendet werden, mit jeder Abfrage andere Datensätze (Duplikate von Schlüssel), werden übersprungen.
InformationsquelleAutor der Antwort crokusek
Wenn Sie etwas anderes ändern der DB (sprich ein anderer Prozess) und brauchen, um sicherzustellen, dass Sie sehen diese änderungen
AsNoTracking()
, sonst EF kann Ihnen die Letzte Kopie, die Ihrem Kontext hatte statt, daher ist es gut, in der Regel mit einem neuen Kontext jede Anfrage:http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/
InformationsquelleAutor der Antwort andrew pate