Не могу ли я вызвать хранимую процедуру из Entity Framework внутри области транзакции? - PullRequest
7 голосов
/ 21 января 2010

У меня есть метод, который использует 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, это был мой обходной путь. Но проблема остается, мне нужно сделать несколько звонков в ближайшем будущем, возможно, в рамках транзакции.

Ответы [ 2 ]

18 голосов
/ 07 декабря 2010

Я наконец-то нашел решение ... похоже, EF ожидает, что хранимая процедура (импортированная функция) вернет значение.поэтому вызовите .FirstOrDefault () для функции, когда она вернется.

2 голосов
/ 26 января 2010

ошибка с hotifx? КБ 936983

...