DbContext und RejectChanges

8

Ich arbeitete mit RIA-Diensten, bei denen ObjectContext die RejectChanges () -Methode verwendet. Ich arbeite jedoch jetzt mit EF 4.4 in einer Desktop-Anwendung und kann diese Methode nicht finden. Meine Frage ist also: In einem Szenario, in dem ich dem Benutzer erlaube, Batch-CrUD-Operationen bei der Sammlung durchzuführen, wie würde ich alle Änderungen rückgängig machen? Ich könnte den Kontext neu erstellen und die Daten erneut abrufen, aber das klingt sehr unnötig, wenn ich die Änderungen wieder auf 1-2 Entitäten zurücksetzen muss.

Was ist also der beste Weg, um Änderungen abzulehnen? Und wie wissen wir, ob der Kontext etwas (IsBusy) macht?

    
Goran 10.05.2012, 13:47
quelle

5 Antworten

11

EF hat keine direkte Änderung "Änderungen zurückweisen". Sie können Entitätseinträge in ChangeTracker / ObjectStateManager durchlaufen und die aktuellen Werte mit den ursprünglichen Werten modifizierter Entitäten überschreiben. Sie können auch hinzugefügte Entitäten trennen und gelöschte Entitäten wieder auf "unverändert" setzen, aber das alles funktioniert meistens nur, wenn Sie (oder EF intern) den Status einer unabhängigen Assoziation (Relation) nicht geändert haben. Wenn Sie auch mit Beziehungen arbeiten, kann das Ganze sehr viel komplizierter werden, weil Sie Beziehungen ebenfalls wiederherstellen müssen - in diesem Fall ist es einfacher, Daten neu zu laden.

Um Änderungen in der DbContext-API rückgängig zu machen, können Sie Folgendes versuchen:

%Vor%

In diesem Fall denke ich, dass das Hauptproblem die Art und Weise ist, wie Sie mit Entitäten arbeiten - Sie erlauben Änderungen an Live-Daten und EF macht seine Logik hinterher, um Daten konsistent zu halten, wenn Änderungen durchgeführt werden, aber später entscheiden Sie diese Änderungen nicht gespeichert werden. In diesem Fall sollten Sie einen der folgenden Schritte ausführen:

  • Verwerfen Sie die geänderten Daten und laden Sie den gesamten Datensatz neu (durch Neuerstellen des Kontexts)
  • Trennen Sie diese Logik, um nicht an Live-Daten zu arbeiten, und schieben Sie die Datenmodifikation nur dann in den EF-Kontext, wenn die Änderung wirklich bestätigt wurde

Der Kontext tut etwas, wenn du es sagst, etwas zu tun. Es wird nie selbst beschäftigt.

    
Ladislav Mrnka 10.05.2012, 14:47
quelle
11
%Vor%     
Sergey Shuvalov 28.02.2014 13:56
quelle
2

Ich weiß, das ist eine alte Frage. Keine der Antworten passt jedoch zu meiner Situation. Ich musste die Änderungen an nur einer Entität in einer Sammlung ablehnen. Das hat bei mir funktioniert:

%Vor%     
Tarzan 20.01.2014 22:47
quelle
1

Das funktioniert für mich:

%Vor%

dies = DbContext in diesem Fall

    
TheSoul75 10.07.2012 12:54
quelle
0

Dies kann eine alte Antwort sein, aber nützlich für neue Besucher .... Die Reload-Funktion lädt das Objekt aus der Datenquelle neu und überschreibt vorhandene Änderungen und die neu geladene Entität hat einen unveränderten Status.

%Vor%     
Kevbo 12.06.2015 21:34
quelle

Tags und Links