Entity Framework: использование транзакций и откатов ... Возможно?

entity-framework transactions

Вопрос

Выпуск: (с Sql 2005)

  • Как я могу запросить базу данных, когда транзакция завершена? (Так как это блокирует стол)
  • Как вызвать откат транзакции, а затем закрыть себя, чтобы можно было запросить таблицу?

Итак, я нашел это много:

[TestMethod]
public void CreateUser()
{
    TransactionScope transactionScope = new TransactionScope();

    DataContextHandler.Context.AddToForumUser(userToTest);
    DataContextHandler.Context.SaveChanges();

    DataContextHandler.Context.Dispose();
}

Где DataContextHandler - простой синглтон, который предоставляет объект контекста для моих сущностей. Кажется, это работает так, как вы думаете. Он создает пользователя, сохраняет, а затем откатывается, когда программа заканчивается. (IE тест заканчивается)

Проблема: как заставить транзакцию откатиться и уничтожить себя, чтобы я мог запросить таблицу?

Причина: в целях тестирования я хочу убедиться, что пользователь:

  • Сохранено
  • Может быть запрошен правильно, чтобы доказать его существование
  • Удаляется (нежелательные данные)
  • Можно запросить, чтобы убедиться, что он был удален.

На данный момент я могу получить откат транзакции, только если тест завершен, и я не могу понять, как выполнить запрос с транзакцией вверх:

[TestMethod]
public void CreateUser()
{
    ForumUser userToTest = new ForumUser();

    TransactionScope transactionScope = new TransactionScope();

    DataContextHandler.Context.AddToForumUser(userToTest);
    DataContextHandler.Context.SaveChanges();     

    Assert.IsTrue(userToTest.UserID > 0);

    var foundUser = (from user in DataContextHandler.Context.ForumUser
                    where user.UserID == userToTest.UserID
                    select user).Count();  //KABOOM Can't query since the 
                                           //transaction has the table locked.

    Assert.IsTrue(foundUser == 1);

    DataContextHandler.Context.Dispose();

    var after = (from user in DataContextHandler.Context.ForumUser
                 where user.UserID == userToTest.UserID
                 select user).Count(); //KABOOM Can't query since the 
                                       //transaction has the table locked.

    Assert.IsTrue(after == 0);
}

ОБНОВЛЕНИЕ Это работало для отката и проверки, но все еще не может выполнить запрос в разделе использования:

using(TransactionScope transactionScope = new TransactionScope())
{
    DataContextHandler.Context.AddToForumUser(userToTest);
    DataContextHandler.Context.SaveChanges();
    Assert.IsTrue(userToTest.UserID > 0);
    //Still can't query here.

}

var after = (from user in DataContextHandler.Context.ForumUser
            where user.UserID == userToTest.UserID
            select user).Count();

Assert.IsTrue(after == 0);

Популярные ответы

Из MSDN ;

«SaveChanges работает в транзакции. SaveChanges откатит эту транзакцию и выдаст исключение, если какой-либо из грязных объектов ObjectStateEntry не будет сохранен».

Таким образом, кажется, что нет необходимости явно добавлять свою собственную обработку транзакций через TransactionScope .



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему