У меня есть метод, который использует Entity Framework для внесения некоторых изменений / вставок в разные сущности, все это внутри одной области транзакции. Эти изменения работают очень хорошо.
Моя проблема началась, когда мне нужно было использовать хранимую процедуру в середине этих операций. Процедура выполняет вставку только в одну таблицу и не имеет явного объявления транзакций. Я попытался объявить транзакцию и совершить транзакцию, но проблема была та же.
Не могу ли я вызвать хранимую процедуру из Entity Framework (EF1) внутри области транзакции?
Это исключение выдается только после транзакции. Complete (), когда закрывающий блок закрыт.
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()
Внутреннее исключение:
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)
ОБНОВЛЕНИЕ: Награда начата
Сегодня я больше не выполняю этот вызов процедуры через Entity Framework. Я вызываю процедуру через ADO.net, это был мой обходной путь. Но проблема остается, мне нужно сделать несколько звонков в ближайшем будущем, возможно, в рамках транзакции.