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);
}

UPDATEこれはロールバックとチェックのために働きましたが、それでもusingセクションの中で問い合わせることができません:

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
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ