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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top