2010-01-21 12 views
7

Tengo un método que usa Entity Framework para hacer algunos cambios/inserciones en diferentes entidades, todo esto dentro de un único alcance de transacción. Estos cambios funcionan muy bien.¿No puedo llamar a un procedimiento almacenado desde Entity Framework dentro de un ámbito de transacción?

Mi problema ha comenzado cuando necesitaba usar un procedimiento almacenado en medio de estas operaciones. El procedimiento solo hace una inserción en una tabla, y no tiene una declaración explícita de transacciones. Intenté declarar una transacción y comprometerme allí también, pero el problema era el mismo.

¿No puedo llamar a un procedimiento almacenado desde Entity Framework (EF1) dentro de un alcance de transacción?

Esta excepción se produce solo después de transaction.Complete(), cuando se cierra el bloque de uso.

The transaction has aborted. 

    at System.Transactions.TransactionStatePromotedAborted.PromotedTransactionOutcome(InternalTransaction tx) 
    at System.Transactions.TransactionStatePromotedEnded.EndCommit(InternalTransaction tx) 
    at System.Transactions.CommittableTransaction.Commit() 
    at System.Transactions.TransactionScope.InternalDispose() 
    at System.Transactions.TransactionScope.Dispose() 

Excepción interna:

The transaction operation cannot be performed because there are pending requests working on this transaction. 

    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest) 
    at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) 
    at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) 
    at System.Data.SqlClient.SqlDelegatedTransaction.SinglePhaseCommit(SinglePhaseEnlistment enlistment) 

ACTUALIZACIÓN: Comienza una recompensa

Hoy no estoy haciendo este llamado procedimiento a través del marco de la entidad más. Estoy llamando al procedimiento a través de ADO.net, esta fue mi solución. Pero el problema continúa, debería hacer algunas llamadas en el futuro cercano, tal vez dentro del alcance de una transacción.

+0

Por ahora, estoy llamando al procedimiento almacenado desde el antiguo ado.net, usando otra cadena de conexión a la misma base de datos. –

Respuesta

18

I Finalmente encontré una solución ... parece que EF espera que el procedimiento almacenado (función importada) devuelva un valor. así que llame a .FirstOrDefault() en la función cuando vuelva.

+0

Esto me ayudó también. Funcionó bien después de devolver el valor (incluso si no lo usé en absoluto) – amhed

+1

Esto solucionó el problema que estábamos llegando aquí también. ¿Cómo es que esto no es un error de EF? –

+0

+1 Esto solucionó el problema que estaba teniendo en EF5. Gracias. – JohnnyHK

Cuestiones relacionadas