Как назначить транзакцию с EF4 CodeFirst CTP5 без использования TransactionScopes? - PullRequest
3 голосов
/ 26 января 2011

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

Ответы [ 2 ]

2 голосов
/ 26 января 2011

Возможно, эта статья о MSDN может помочь Управление соединениями и транзакциями , а затем прокрутить вниз до заголовка Транзакции и Entity Framework . Вот где я бы начал.

РЕДАКТИРОВАТЬ: Вот лучший вариант: Как: управлять транзакциями в Entity Framework

1 голос
/ 26 января 2011

Это глупо, но может быть единственным вариантом здесь:

((EntityConnection)myObjectContext.Connection).StoreConnection.BeginTransaction(...
...