2011-07-19 16 views
12

MSDTCを呼び出さずにTransactionScopeを使用して複数のデータベース操作を実行できるように、既存のデータベース接続を再利用しようとしています。DbContextは再利用のために接続を開いたままにしません

エンティティフレームワーク(新しいリリースDbContextを4.1リリースで使用)では、明示的に開いた接続を開いたままにしたくないようです。古いObjectContext APIは、接続が期待通りに開いていることを維持し、documentedを保持します。

DbContext APIはフードの下でちょうどObjectContextを使用しているため、同じ動作が予想されます。この変更が意図されているのか、それとも既知の問題なのか誰にでも分かりますか?私はそれがどこに文書化されて見つけることができません。

public void ConnectionRemainsOpen() 
{ 
    using (var context = new TestDataContext()) 
    { 
     try 
     { 
      Assert.AreEqual(ConnectionState.Closed, context.Database.Connection.State); 

      context.Database.Connection.Open(); 

      var firstRecord = context.Table3.FirstOrDefault(); 

      // this Assert fails as State == ConnectionState.Closed 
      Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State); 

      var newRecord = new Table3 
      { 
       Name = "test", 
       CreatedTime = DateTime.UtcNow, 
       ModifiedTime = DateTime.UtcNow 
      }; 

      context.Table3.Add(newRecord); 

      context.SaveChanges(); 

      // this Assert would also fail 
      Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State); 
     } 
     finally 
     { 
      if (context.Database.Connection.State == ConnectionState.Open) 
       context.Database.Connection.Close(); 
     } 
    } 
} 
+0

Open()後、最初のクエリの前にAssertを置くと、結果はどうなりますか?私はここの問題が実際に接続を閉じて再オープンするのではなく、間違った値を返すのではないかと疑問に思っています。 – Tridus

+0

@Tridus、あなたが提案するAssertは、 'Open'の期待される結果を返します。 – GWB

+0

これは古い投稿ですが、私はJulia Lermanの本を読んでいました。使用する構文はcontext.Connection.Open()です(つまり、コンテキストとConnectionの間のデータベースはありません)。ちょっとした考え。 – Tod

答えて

14

接続を制御する場合は、コンテキストの前に作成してコンテキストに渡す必要があります。そうでない場合は、接続が制御できません。

using (var connection = ...) 
{ 
    using (var context = new TestDataContext(connection, false)) 
    { 
     ... 
    } 
} 
+0

これはEF 4.0と4.1の間で文書化された変更ですか? – GWB

+0

コンストラクタの2番目のパラメータは、コンテキストが接続を所有しているかどうかを伝えるため、これは文書化されていると思います。 –

+0

私はあなたのソリューションを試しましたが、同じ結果が得られました。コンテキストは依然として満足できる状態で接続状態を変更します。 – GWB

関連する問題