實體框架:使用事務和回滾......可能嗎?

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顯式添加自己的事務處理。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow