3 Stimmen

context.detach - für die Müllabfuhr

Meine Anwendung verwendet eine Kontextinstanz, die während der gesamten Lebensdauer der Anwendung besteht. Ich verwende Entity Framework zum Lesen und Schreiben aller Daten in die Datenbank. Nachdem ich Objekte hinzugefügt habe, möchte ich, dass sie vom Garbage Collector bereinigt werden, damit sie nicht im Speicher verbleiben. Ich habe das Folgende versucht:

    While context.BatchProgresses.Count > 0
        context.Detach(context.BatchProgresses.First())
    End While

aber dies führt zu einer Endlosschleife. Sollte nicht Context.Detach() Artikel entfernen aus Context.BatchProgresses ?

1voto

Yakimych Punkte 17286

Wie in solchen Fällen üblich, können Sie den ObjectStateManager verwenden, wenn Sie die Datenbank nicht erneut abfragen, sondern mit Entitäten arbeiten möchten, die dem Kontext zugeordnet sind:

var attachedEntities = context.
                       ObjectStateManager.
                       GetObjectStateEntries(EntityState.Added | 
                                             EntityState.Deleted |
                                             EntityState.Modified | 
                                             EntityState.Unchanged).
                       Where(ent => ent.Entity is BatchProgress).
                       Select(ent => ent.Entity as BatchProgress).
                       ToList();

foreach (var attachedEntity in attachedEntities)
{
    context.ObjectStateManager.ChangeObjectState(attachedEntity, EntityState.Detached);
}

Wird der ObjectState auf EntityState.Detached gesetzt, wird die Entität aus der Sammlung entfernt. Sie können dies überprüfen, indem Sie am Ende erneut attachedEntities abrufen - es wird keine geben.

0voto

STO Punkte 9762

Es ist nur eine Idee, aber möglicherweise führt der Aufruf von BatchProgress.First() zum Lesen der Datenbank. Stellen Sie sicher (durch Logger oder SQL-Profiler), dass aufgrund dieses Aufrufs keine SQL-Aktivität durchgeführt wird.

Sie können auch folgenden Code ausprobieren (C#)

var list = context.BatchProgress.ToList();
foreach(var item in list)
    context.Detach(item);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X