【问题标题】:Can't I call a stored procedure from Entity Framework inside a transaction scope?我不能在事务范围内从实体框架调用存储过程吗?
【发布时间】:2010-01-21 12:10:32
【问题描述】:

我有一个使用实体框架在不同实体中进行一些更改/插入的方法,所有这些都在单个事务范围内。这些更改效果很好。

当我需要在这些操作中间使用存储过程时,我的问题就开始了。该过程只在一个表中插入,并且没有明确的事务声明。我试过声明一个事务并在那里提交,但问题是一样的。

我不能在事务范围内从实体框架 (EF1) 调用存储过程吗?

只有在 transaction.Complete() 之后,当 using 块关闭时才会抛出此异常。

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)

更新:开始赏金

今天我不再通过实体框架执行此过程调用。我正在通过 ADO.net 调用该过程,这是我的解决方法。但是问题仍然存在,我应该需要在不久的将来进行一些调用,可能在事务范围内。

【问题讨论】:

  • 现在,我从普通的旧 ado.net 调用存储过程,使用另一个连接字符串到同一个数据库。

标签: entity-framework stored-procedures transactionscope


【解决方案1】:

我终于找到了一个解决方案...似乎 EF 期望存储的过程(导入函数)返回一个值。 所以在函数返回时调用 .FirstOrDefault() 。

【讨论】:

  • 这对我也有帮助。返回值后它工作正常(即使我根本没有使用它)
  • 这也解决了我们在这里遇到的问题。这怎么不是 EF 错误?
  • 是的,差不多就是这样。你必须评估结果。更多信息:christianarg.wordpress.com/2010/12/04/…
【解决方案2】:

hotifx 的错误? KB 936983

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多