在事务范围内,我能否从Entity Framework调用存储过程?

9
我有一个方法,使用Entity Framework在不同的实体中进行一些更改/插入,所有这些都在单个事务范围内完成。这些更改非常有效。
当我需要在这些操作中间使用存储过程时,我的问题开始了。该存储过程仅在一个表中进行插入,并且没有明确声明事务。我尝试声明一个事务并在那里提交,但问题仍然存在。
我能否在事务范围内从Entity Framework(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)

更新:开始悬赏

今天我不再使用Entity Framework进行此过程调用,而是通过ADO.net来调用过程,这是我的解决方法。但问题仍然存在,我可能需要在不久的将来进行一些调用,也许是在事务范围内。


到目前为止,我正在使用另一个连接字符串从普通的ado.net调用存储过程,连接到同一个数据库。 - Victor Rodrigues
2个回答

19

我终于找到了一个解决方案......看起来 EF 希望存储过程(导入的函数)返回一个值。 因此,在函数返回时调用 .FirstOrDefault()。


这个对我也很有帮助。在返回值后它可以正常工作(即使我根本没有使用它)。 - amhed
1
这解决了我们在这里遇到的问题。这不是EF的一个bug吗? - Craig Fisher
是的,那基本上就是这样。你必须评估结果。更多信息:https://christianarg.wordpress.com/2010/12/04/entity-framework-4-execute-a-writing-stored-procedure-inside-a-transactionscope/ - Christian Rodriguez

2
一个热补丁中的一个错误?KB 936983

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接