实体框架:使用事务和回滚......可能吗?

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在一个事务中运行。如果任何脏的ObjectStateEntry对象无法持久化,SaveChanges将回滚该事务并抛出异常。”

所以似乎没有必要通过TransactionScope显式添加自己的事务处理。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因