2

私はこのようになります統合テストを持っている:EF 4.1 - ストアドプロシージャの未継承保留中のトランザクション

using (var tran = Connection.BeginTransaction(IsolationLevel.ReadUncommitted)) 
{ 
    try 
    { 
     // Act. 
     var result = controller.Create(something); 

     // Assert. 
     Assert.IsNotNull(result); 
    } 
    catch (Exception exc) 
    { 
     Assert.Fail(exc.Message); 
    } 
    finally 
    { 
     tran.Rollback(); 
     Connection.Close(); 
    } 
} 

は今、そのCreate方法では、私は複数の結果を返すストアドプロシージャを呼び出すに終わりますセット。私は、次の例外を取得

var cmd = Database.Connection.CreateCommand(); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "exec dbo.MySP @SomeParam"; 
cmd.Parameters.Add(new SqlParameter { Value = "test", ParameterName = "SomeParam" }); 

using (var rdr = cmd.ExecuteReader()) <--- exception thrown here. 
{ 
    // code to read result sets. 
} 

:ここ

は、そのSPを呼び出すためのコードです

のSystem.InvalidOperationException:ExecuteReaderの接続がに割り当てられたときに、トランザクションを持っているコマンドが必要ですコマンドは保留中のローカルトランザクションにあります。コマンドのTransactionプロパティが初期化されていません。私が推測する

は理にかなって、私はそれが保留中のローカル・トランザクションを継承するだろうと思ったでしょうか?

私は以前、上記のコードを開いて新しい接続をオープンしましたが、コミットされていない独立性レベルにもかかわらず、保留中のトランザクションが特定のテーブルにあったためタイムアウトしました。

  1. が、その後、DBに一部のレコードを保存するデータにアクセスする別のストアドプロシージャを呼び出すなど、いくつかのものを、いトランザクションを開きます:

    は基本的に、私は統合テストを持ってできるようにする必要があります新しく作成されたデータを含む

  2. トランザクションをロールバックします。

どのようなアイデアですか?

+0

IsolationLevel.ReadUncommittedを使用した統合テストは、(DBへの排他的アクセス権がない限り)非常に堅牢である可能性は低いです。 –

+0

@MitchWheat - それでは何をお勧めしますか? – RPM1984

答えて

1

これは動作します:

using (new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions 
    { 
     IsolationLevel = IsolationLevel.ReadUncommitted 
    })) 

これはしません:それはすべての接続を包むよう

using (var tran = Connection.BeginTransaction(IsolationLevel.ReadUncommitted)) 
{ 

は、TransactionScopeは、実際の接続の外に住んでいるという事実とは何かを持っている必要がありますその内部で開かれていますが、前者のコードは特定の接続でトランザクションを開きます。