2016-04-28 4 views
0

Ich habe eine WPF-Anwendung mit Entity Framework für die Datenpersistenz entworfen. Die gesamte Interaktion mit der Datenbank erfolgt über die Entity Framework-Infrastruktur.C# Entity Framework: Check & Execute Logic (Mehrere Benutzer)

Ich mag würde eine boolesche Eigenschaft auf eine bestimmte Entity zu überprüfen, und wenn es falsch ist, eine gewisse Logik gegen diese Unternehmen und verbundenen Unternehmen auszuführen. Die Anwendung wird jedoch in einer Umgebung mit mehreren Benutzern verwendet. Daher kann der Code möglicherweise die Prüfung bestehen (dh die boolesche Eigenschaft kann falsch sein), aber ein anderer Benutzer kann abfangen und nur die Änderungen des letzten Benutzers werden gespeichert (optimistisch) Nebenläufigkeit).

Wie kann ich die Kontrolle und die Updates für das Unternehmen und verbundenen Unternehmen wickeln, so dass entweder alle der Code ausgeführt wird, oder kein Code? Ich verstehe, dass Transaktionen die Lösung für dieses Problem sein können? Wenn ja, wie werden diese im Entity Framework implementiert?

Danke!

+0

Ist es möglich, die entscheidende Eigenschaft zu aktualisieren, bevor der Rest der Logik ausgeführt wird? –

Antwort

2
using (var context = new YourContext()) 
      { 
       using (var dbContextTransaction = context.Database.BeginTransaction()) 
       { 
        try 
        { 
         //Your logic here 
         context.SaveChanges(); 

         dbContextTransaction.Commit(); 
        } 
        catch (Exception) 
        { 
         dbContextTransaction.Rollback(); 
        } 
       } 
      } 
+0

Bitte vergessen Sie nicht zu wählen, wenn es Ihnen hilft – suulisin

+0

Das macht den Trick, vielen Dank! Bevor ich die akzeptierte Antwort markiere, habe ich ein interessantes Verhalten aufgegriffen. Wenn ich mitten in der Transaktion einen Haltepunkt platziere, um absichtlich einen Konflikt zu erzeugen, hängen die anderen Benutzer auf context.SaveChanges(), bis der Server das Zeitlimit überschreitet. Ich würde es vorziehen, sich nicht mit den aktuellen Timeout-Grenzen herumzuärgern. Gibt es eine Strategie, um eine Transaktion in Kraft zu setzen und den Kontext zu verlassen/verschieben.SaveChanges() für die Benutzer, die den "Hang" haben? –

+0

ich nicht Sie richtig verstehen, aber man kann diese Aufgabe auf der Transaktion prüfen, ob (Transaction.Current.TransactionInformation.Status == TransactionStatus.Committed) { // leitet} – suulisin