Wie entferne ich zuerst Objekte im Entity Framework-Code?

Antworten:

156

Wenn Sie ein vorhandenes Objekt entfernen möchten, befolgen Sie die Anweisungen von @ Slauma. Wenn Sie Objekte laden möchten, ohne Änderungen zu verfolgen, verwenden Sie:

var data = context.MyEntities.AsNoTracking().Where(...).ToList();

Wie im Kommentar erwähnt, werden Entitäten dadurch nicht vollständig getrennt. Sie sind immer noch angehängt und das verzögerte Laden funktioniert, aber Entitäten werden nicht verfolgt. Dies sollte beispielsweise verwendet werden, wenn Sie eine Entität nur zum Lesen von Daten laden möchten und nicht vorhaben, sie zu ändern.

Ladislav Mrnka
quelle
3
@ Ladislav: Dies ist in der Tat wahrscheinlich, was Lol Codierer gemeint hat. Ich habe diese Methode noch nie benutzt und darüber nachgedacht, obwohl ich oft Objektlisten lade und den Kontext sofort entsorge, so etwas wie using(ctx){ return ctx....ToList(); }. In solchen Fällen AsNoTracking()wäre die Verwendung sehr sinnvoll, da ich das unnötige Ausfüllen des Objektkontexts sparen würde. Ich denke, es hätte wahrscheinlich einen Vorteil in Bezug auf Leistung und Speicherverbrauch, insbesondere bei großen Listen, oder?
Slauma
1
@Slauma: Ja, es hat Leistungsvorteile. Das ist eigentlich der Grund, warum diese Methode existiert. Die Verwendung dieses Ansatzes in der ObjectContext-API ist etwas komplizierter.
Ladislav Mrnka
2
Deaktiviert dies das verzögerte Laden?
Shawn Mclean
3
Tatsächlich wird dadurch das verzögerte Laden nicht deaktiviert, sondern nur die Änderungsverfolgung deaktiviert und die Leistung verbessert = die Entität ist noch angehängt. Ich habe es gefunden, nachdem ich diese Frage beantwortet habe, daher sollten Sie @ Slaumas als gültige Antwort markieren.
Ladislav Mrnka
1
Das ist was ich will. Ich möchte ein verzögertes Laden und die Möglichkeit, nur eine getrennte Entität zu ändern.
Shawn Mclean
255

Dies ist eine Option:

dbContext.Entry(entity).State = EntityState.Detached;
Slauma
quelle
3
Kann ich dies tun, wenn ich Objekte abrufe, die eine IQueryable zurückgeben?
Shawn Mclean
1
@Lol coder: Ich bin nicht sicher, ob ich Sie richtig verstehe, sondern entitymuss ein materialisiertes Objekt eines Typs sein, der Teil Ihrer Modellklassen ist (Person, Kunde, Bestellung usw.). Sie können ein IQueryable <T> nicht direkt an übergeben dbContext.Entry(...). Ist das die Frage, die du gemeint hast?
Slauma
9
@EladBenda: Es kommt darauf an. Wenn Sie ein Objekt trennen möchten, das bereits an den Kontext angehängt ist, setzen Sie den Status auf Detached. Wenn Sie Entitäten aus der Datenbank laden möchten, ohne sie überhaupt an den Kontext anzuhängen (keine Änderungsverfolgung), verwenden Sie AsNoTracking.
Slauma
1
Ich habe mit dieser Methode ein interessantes Problem gefunden. Obwohl die Entität möglicherweise eine Proxy-Klasse ist, funktioniert das verzögerte Laden nicht, nachdem Sie ihren Status in geändert haben Detached.
Kjbartel
4
@kjbartel: Dies ist das erwartete Verhalten, da die Entität keine Verbindung zum Kontext hat.
Ricardo Souza