Linq to SQL dataContext проблема времени жизни - PullRequest
2 голосов
/ 07 августа 2009

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

Спасибо

1 Ответ

1 голос
/ 08 августа 2009

Контексты данных в идеале должны быть единицей работы. Мне не на 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...