Linq to SQL dataContext终身问题

时间:2009-08-07 18:04:21

标签: linq-to-sql

我正在使用Linq to SQL编写多个单元测试。有时我的代码是这样的:

var products = dataContext.Products;
Assert.That(1, dataContext.ExecuteQuery<int>("select count(*) from product").First()); //this works
Assert.That(1, products.Count()); //this works

dataContext.spCalculateMoreProducts();

Assert.That(2, dataContext.ExecuteQuery<int>("select count(*) from product").First()); //this works
Assert.That(2, products.Count()); // this fails, saying that got 1 instead of 2 

spCalculateMoreProducts是一个存储过程,可以将更多产品插入到Linq之外的SQL中。这个问题是dataContext.Products永远不会刷新。我的理解是这就是Linq to SQL的工作原理。我认为它一般都很好,但我想以某种方式强制刷新,所以我可以像上面那样编写我的单元测试。我无法创建新的datacontext,因为整个单元测试在单个事务中运行,最后会回滚。有任何想法吗?

由于

1 个答案:

答案 0 :(得分:1)

理想情况下,数据上下文应该是一个工作单元。对我来说,测试失败的地方并不是100%清楚,但我不明白为什么你不能在同一个交易中拥有多个数据上下文。

如果您使用的是基于连接的交易,那么请确保将SqlTransaction提供给所有上下文。但更简单的是使用TransactionScope;所有数据上下文都将在环境事务中登记。这使得在DAL中集成测试代码变得轻而易举,而无需更改数据。例如:

using(var tran = new TransactionScope()) {

    using(var ctx1 = new MyDataContext()) { ... } 

    SomeDal.SomeMethod(1,2,3);

    using(var ctx2 = new MyDataContext()) { ... } 

    using(var ctx3 = new MyDataContext()) { ... } 
}

此处,使用SqlConnection的任何内容(除非故意使用null-transaction)都应该在您的事务中,因为我们不调用tran.Complete()而回滚它。