2009-08-07 7 views
2

Я использую Linq to SQL для написания нескольких модульных тестов. Иногда у меня есть код что-то вроде этого:Linq to SQL dataContext проблема времени жизни

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, потому что все модульные тесты выполняются в одной транзакции, которая возвращается в конце. Есть идеи?

Благодаря

+0

Марк, вам повезло? Мне тоже нужно смешивать в одном файле ExecuteCommand (sql) массовое обновление/вставляет/удаляет все в том же DataContext. – PeteShack

ответ

1

Data-контексты идеале должна быть единица работы. Мне не на 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 должно (если он намеренно не использует нуль-транзакцию) быть в вашей сделке, которая наматывается обратно, потому что мы не называем tran.Complete().