【发布时间】:2012-01-19 05:53:34
【问题描述】:
我有一个如下所示的集成测试:
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 连接,但由于未提交的读取隔离级别,挂起的事务在某些表上具有明显的锁定,所以它只是超时了。
基本上,我需要能够进行集成测试:
- 开启交易
- 做一些事情,包括将一些记录保存到数据库中,然后调用另一个存储过程来访问包含新创建的数据的数据
- 回滚交易。
各位有什么想法吗?
【问题讨论】:
-
使用 IsolationLevel.ReadUncommitted 的集成测试不太可能非常健壮(除非您拥有对 DB 的独占访问权限)。
-
@MitchWheat - 那么你有什么推荐的呢?
标签: sql-server-2008 entity-framework stored-procedures transactions entity-framework-4.1