Я пытаюсь выполнить функциональные тесты для работающей базы данных, чтобы убедиться, что мои запросы linq корректно переводятся в SQL. Я хочу сделать это с помощью транзакций, чтобы один функциональный тест не влиял на другой.
Проблема в том, что я не могу найти какой-либо способ в API правильно использовать транзакции. Я могу получить новый DbTransaction
через MyDbContext.Database.Connection.BeginTransaction()
, однако я не могу найти способ использовать эту транзакцию.
Вся документация, которую я могу найти о вызове BeginTransaction()
, заключается в том, что вы назначаете объект транзакции для SqlCommand
через вызов cmd.Transaction
для команды, с которой вы выполняете действия. Однако в EF4 CTP5 нет доступа к SqlCommand
, используемому для запросов.
Таким образом, я не могу понять, как использовать транзакцию, с которой я начал BeginTransaction()
.
Я не хочу использовать TransactionScope
объекты, в основном потому, что Sql CE 4 не поддерживает их, и я бы предпочел использовать локальную базу данных и не ходить по сети. Sql CE 4 поддерживает транзакции, полученные через BeginTransaction()
, я просто не могу понять, как с кодом в первую очередь.
Кто-нибудь знает, как это сделать?
Редактировать : После некоторых писем в Microsoft, кажется, что
TransactionScope()
звонки предназначены для основного способа использования транзакций с EF4. Чтобы заставить
TransactionScope
работать с Sql CE, вы должны явно открыть соединение с базой данных перед началом транзакции, например,
[TestMethod]
public void My_SqlCeScenario ()
{
using (var context = new MySQLCeModelContext()) //ß derived from DbContext
{
ObjectContext objctx = ((IObjectContextAdapter)context).ObjectContext;
objctx.Connection.Open(); //ß Open your connection explicitly
using (TransactionScope tx = new TransactionScope())
{
var product = new Product() { Name = "Vegemite" };
context.Products.Add(product);
context.SaveChanges();
}
objctx.Connection.Close(); //ß close it when done!
}
}