5 Stimmen

Aufruf einer gespeicherten Prozedur innerhalb von TransactionScope in Entity Framework

Ich verwende Entity Framework 4 und treffe auf folgendes Problem mit der Ausführung von gespeicherten Prozeduren in der Umgebungstransaktion. Hier ist der Code:

public void UpdateOrderRequest(IOrder order, int requestId, int userId, Fee fee)
{
    using (var tscope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        _storedProcedureDA.UpdateOrderRequest(requestId, userId, data.ClientId, data.RequestStatus, data.Date,
                              data.Type, data.Side, data.Quantity, data.ExecInst, data.Price,
                              data.StopPrice, data.TimeInForce, data.Description, data.Target);
        var feeDa = new FeeDA();
        var dbFee = new Domain.Entities.Fee
                        {
                            OrderRequestId = requestId,
                            Identifier = fee.Id,
                            Value = fee.Value,
                        };
        feeDa.Save(dbFee);
        tscope.Complete();
    }
}
  1. _StoredProceduresDA und FeeDA sind Datenzugriffsklassen, die jeweils eine Instanz von DataContext verwenden.
  2. Die Methode _storedProcedureDA.UpdateOrderRequest() ist nur ein Wrapper unter Context.ExecuteFunction<..>("AddOrderRequest",...)
  3. feeDA.Save() fügt Entität in Repository ein und ruft Context.SaveChanges()
  4. Wenn ich versuche, diesen Aufruf zu machen, fange ich folgende Ausnahme: The transaction operation cannot be performed because there are pending requests working on this transaction.

Der Punkt ist, dass ich diese beiden Operationen in einer Transaktion durchführen muss und ich kann nicht Workaround in vorgeschlagen verwenden Kann ich eine gespeicherte Prozedur aus Entity Framework nicht innerhalb eines Transaktionsbereichs aufrufen? (ado.net verwendet eine eigene Verbindung) Weiß jemand, wie man DataContext.ExecuteFunction<>() in eine Transaktion verpackt?

P.S. Ich habe versucht, ExecuteFunction in eine eigene Transaktion mit eigenem TransactionScope mit allen möglichen Parametern (Supress und so weiter) zu verpacken, aber nichts hat geholfen.

3voto

Kirkaiya Punkte 1035

Schauen Sie sich das ähnliche Problem in diese andere Stackoverflow-Frage insbesondere bei Antwort Nr. 4:

"Ich habe endlich eine Lösung gefunden...es scheint, dass EF erwartet, dass der Stored Proc (importierte Funktion) einen Wert zurückgibt. Also rufen Sie .FirstOrDefault() auf der Funktion auf, wenn sie zurückkehrt."

Wenn das auf Ihr eigenes Problem anwendbar ist, dann innerhalb Ihrer _storedProcedureDA.UpdateOrderRequest-Methode, wo Sie Context.ExecuteFunction aufrufen, greifen Sie den Rückgabewert (wahrscheinlich int) und geben Sie es zurück an die aufrufende Methode (so ändern Sie UpdateOrderRequest von void zu int oder was auch immer der Rückgabewert Typ ist).

Wie ich sehe, ist diese Frage schon ziemlich alt. Vielleicht haben Sie sie schon vor langer Zeit gelöst und sind weitergezogen?

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