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();
}
}
- _StoredProceduresDA und FeeDA sind Datenzugriffsklassen, die jeweils eine Instanz von DataContext verwenden.
- Die Methode _storedProcedureDA.UpdateOrderRequest() ist nur ein Wrapper unter
Context.ExecuteFunction<..>("AddOrderRequest",...)
feeDA.Save()
fügt Entität in Repository ein und ruftContext.SaveChanges()
- 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.