4 Stimmen

Entity-Framework - was zu tun, wenn SaveChanges fehlschlägt und ich nicht möchte, dass einige Änderungen vorgenommen werden?

Ich glaube, ich stoße auf ein allgemeines Problem: Ich möchte versuchen, ein Objekt in die Datenbank einzufügen. Wenn der Primärschlüssel verletzt wird, möchte ich das Einfügen abbrechen. (dies ist ein Beispiel, die Frage gilt wirklich für jede Art von Fehler und jede der CRUD-Operationen)

Wie kann ich Änderungen am EF-Kontext verwerfen?

Ich kann es mir nicht leisten, sie jedes Mal neu zu erstellen, wenn etwas schief geht.

PS. Ich weiß, dass ich vielleicht überprüfen könnte, ob alles in Ordnung ist, z. B. durch Abfragen der Datenbank, aber ich mag die Idee nicht. Die Datenbankeinschränkungen sind aus irgendeinem Grund da, und auf diese Weise ist es schneller und ich muss weniger Code schreiben.

1voto

Ladislav Mrnka Punkte 355028

Sie können die eingefügte Entität von ObjectContext . Sie können auch verwenden ObjectStateManager und seine Methode GetObjectStateEntries . Unter ObjectStateEntry können Sie seinen Zustand ändern.

Das Problem ist, dass Sie die Technologie nicht in der angenommenen Weise nutzen:

Ich kann es mir nicht leisten, es jedes Mal neu zu machen. wenn etwas schief geht.

Natürlich sollten Sie das, denn Ihr Code verhindert solche Situationen nicht.

PS. Ich weiß, dass ich vielleicht überprüfen könnte ob alles in Ordnung ist, z.B. durch Abfrage der der Datenbank, aber die Idee gefällt mir nicht. Db Constraints sind aus irgendeinem Grund da [ ] weniger Code schreiben.

Ja, Sie sollten überprüfen, ob alles in Ordnung ist. Der Aufruf der Datenbank zur "Validierung" Ihrer Daten ist etwas, das DBAs wirklich mögen (Sarkasmus). Es liegt in Ihrer Verantwortung, die höchstmögliche Validität Ihrer Daten zu erreichen, bevor Sie die SaveChanges . Ich kann mir vorstellen, dass viele erfahrene Entwickler/Teamleiter Ihren Code einfach nicht durch ihre Codeprüfung schicken würden. Und übrigens: In den meisten Fällen geht es nicht schneller, weil die Kommunikation zwischen den Prozessen oder im Netzwerk nicht funktioniert.

0voto

franklins Punkte 3694

Versuchen Sie es mit DbTransaction.

System.Data.Common.DbTransaction _tran = null;

 _tran = _ent.Connection.BeginTransaction();

_tran .Commit (); //after SaveChanges();

und wenn es eine Ausnahme gibt einen Rollback durchführen.

_tran.Rollback();

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