9

Entity Framework を使用して、さまざまなエンティティでいくつかの変更/挿入を行うメソッドがあり、これらすべてが単一のトランザクション スコープ内にあります。これらの変更は非常にうまく機能します。

私の問題は、これらの操作の途中でストアド プロシージャを使用する必要が生じたときに始まりました。このプロシージャは、1 つのテーブルへの挿入のみを行い、トランザクションの明示的な宣言は行いません。トランザクションを宣言してコミットしようとしましたが、問題は同じでした。

トランザクション スコープ内で Entity Framework (EF1) からストアド プロシージャを呼び出すことはできませんか?

この例外は、使用中のブロックが閉じられたときに、transaction.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 を介して手順を呼び出しています。これが私の回避策でした。しかし、問題は続きます。近い将来、おそらくトランザクション スコープ内でいくつかの呼び出しを行う必要があります。

4

2 に答える 2

19

私は最終的に解決策を見つけました... EF は、ストアド プロシージャ (インポートされた関数) が値を返すことを期待しているようです。そのため、関数が戻ったときに .FirstOrDefault() を呼び出します。

于 2010-12-07T16:52:18.803 に答える
2

hotifx のバグ?KB936983

于 2010-01-26T20:13:54.270 に答える