EF 4.1 - 存储过程不继承待处理事务

时间:2012-01-19 05:53:35

标签: sql-server-2008 entity-framework stored-procedures transactions entity-framework-4.1

我有一个看起来像这样的集成测试:

using (var tran = Connection.BeginTransaction(IsolationLevel.ReadUncommitted))
{
   try
   {
      // Act.
      var result = controller.Create(something);

      // Assert.
      Assert.IsNotNull(result);
   }
   catch (Exception exc)
   {
      Assert.Fail(exc.Message);
   }
   finally
   {
      tran.Rollback();
      Connection.Close();
   }
}

现在,在Create方法中,我最终调用了一个返回多个结果集的存储过程。

以下是调用该SP的代码:

var cmd = Database.Connection.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "exec dbo.MySP @SomeParam";
cmd.Parameters.Add(new SqlParameter { Value = "test", ParameterName = "SomeParam" });

using (var rdr = cmd.ExecuteReader()) <--- exception thrown here.
{
   // code to read result sets.
}

我得到以下异常:

  

System.InvalidOperationException:当分配给命令的连接处于挂起的本地事务中时,ExecuteReader要求命令具有事务。该命令的Transaction属性尚未初始化。

我认为这是有道理的,但我会认为继承挂起的本地交易?

我之前有上面的代码打开了一个 new 连接,但由于挂起事务对某些表的明显锁定,它只是超时,尽管读取了未提交的隔离级别。

基本上,我需要能够进行集成测试:

  1. 打开交易
  2. 做一些事情,包括将一些记录保存到db,然后调用另一个访问包含新创建数据的数据的存储过程
  3. 回滚交易。
  4. 任何想法的人?

1 个答案:

答案 0 :(得分:1)

这有效:

using (new TransactionScope(TransactionScopeOption.Required, 
   new TransactionOptions 
   { 
      IsolationLevel = IsolationLevel.ReadUncommitted
   }))

这不是:

using (var tran = Connection.BeginTransaction(IsolationLevel.ReadUncommitted))
{

必须与TransactionScope在外部实际连接的事实有关,因此它包装了在其中打开的所有连接,而前一代码打开了事务具有特定的联系。