Wie aktualisiere ich Entity Framework -Objekte, ohne alle Instanzen dieses Objekts zu ändern?
-
26-10-2019 - |
Frage
Ich habe diesen Code, der Entity Framework 4.1 verwendet, um auf Datenbankentitäten zuzugreifen:
public string Test()
{
Navigation nav = db.Navigations.FirstOrDefault();
List<Navigation> lNav = db.Navigations.ToList();
foreach (var item in lNav)
{
item.Label += " [Edited]";
}
return nav.Label;
}
Wenn ich dies in ASP.NET MVC ausführe, wird dies zurückgegeben:
News [Edited]
Ich erwartete, dass es zurückkehren würde:
News
Weil ich meine dachte foreach
würde nur den Inhalt von ändern lNav
. Stattdessen scheint es alle Instanzen der Entitätsobjekte zu ändern.
Wie kann ich ändern lNav
ohne auch zu ändern nav
?
Lösung
Versuchen AsNoTracking()
:
Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault();
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList();
Auf diese Weise werden geladene Entitäten nicht an den Kontext gebunden, und für die erste Entität sollten zwei verschiedene Instanzen erstellt werden. Durch die Nutzung AsNoTracking
Sie deaktivieren die Identitätszuordnung zwischen Schlüsselwerten einer Entität und Objektreferenzen, die für das von Ihnen beobachtete Verhalten verantwortlich sind. (Es kann immer nur eine Entitätsreferenz mit einem bestimmten Schlüssel im Kontext geben, und EF erstellt kein neues Objekt, wenn Sie eine Entität mit demselben Schlüssel laden. Stattdessen gibt es das Objekt zurück, das bereits im Kontext vorhanden ist.)
Beachten Sie, dass Sie dies nicht verwenden können, wenn Sie die Entitäten mit Hilfe des EFS -Änderungsverfolgungsmechanismus aktualisieren möchten. AsNoTracking()
ist für Readonly -Szenarien entwickelt.