2016-07-01 12 views
0

In meiner Anwendung habe ich zwei Methoden: GetPaymentToDate und RemovePayment:Update-Datenbank mit verschachtelten Transaktionen Umfang

public Payment RemovePayment(int paymentId) 
{ 
    Payment payment; 
    using (var transaction = new TransactionScope(TransactionScopeOption.RequiresNew, 
     new TransactionOptions { IsolationLevel = IsolationLevel.Serializable })) 
    { 
     //some staff 
     m_staffContext.SaveChanges(); 
     transaction.Complete(); 
    } 
    return payment; 
} 

public Payment GetPaymentToDate(DateTime paymentDate) 
{ 
    var payment = new Payment 
    { 
     //initialize properties 
    }; 
    using (var transaction = new TransactionScope(TransactionScopeOption.RequiresNew, 
     new TransactionOptions { IsolationLevel = IsolationLevel.Serializable })) 
    { 
     m_staffContext.Payments.Add(payment); 
     m_staffContext.SaveChanges(); 
     transaction.Complete(); 
    } 
    return payment; 
} 

Nein Ich aktualisieren Methode implementieren müssen. Die Logik dieser Methode besteht darin, die alte zu entfernen und dann eine neue Zahlung zu erstellen. Also möchte ich es in einem übergeordneten Transaktionsbereich tun und eine geschachtelte Transaktion zurückrollen, wenn die andere fehlgeschlagen ist. Ich werde TransactionScopeOption.RequiresNew Option aus bestehenden Methoden löschen und in Update-Methode schreiben Sie etwas wie folgt aus:

public Payment UpdatePayment(int paymentId) 
{ 
    Payment newPayment; 
    using (var transaction = new TransactionScope(TransactionScopeOption.RequiresNew, 
     new TransactionOptions { IsolationLevel = IsolationLevel.Serializable })) 
    { 
     var removedPayment = RemovePayment(paymentId); 
     var newPayment = GetPaymentToDate(removedPayment.Date); 
     m_staffContext.SaveChanges(); 
     transaction.Complete(); 
    } 
    return newPayment;   
} 

Bin ich mit meinem Code korrekt?

+0

Warum haben Sie 'RequiresNew' mit jedem Transaktionsbereich? Der Standardwert ist in Ordnung. – Maarten

Antwort

1

Sie sollten die Methoden aufrufen, aber die eigentliche Logik in Update Zahlung bei der Verwendung Block wie implementieren:

using(var transaction = .....) 
{ 
    var payment = m_staffContext.Payments.Get(paymentId); 
    m_staffContext.Payments.Remove(payment); 
    m_staffContext.Payments.Add(payment); 
    m_staffContext.SaveChanges(); 
} 

Aber warum sind Sie nicht die Aktualisierung der bestehenden Zahlungs nur. In der AddNewPayment-Methode kann die Initialisierung des Payment-Objekts in einer separaten Methode durchgeführt werden, um wiederverwendet zu werden.

Bitte kommentieren Sie, wenn dies Ihr Problem nicht löst.