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();
}
}
}
Open()後、最初のクエリの前にAssertを置くと、結果はどうなりますか?私はここの問題が実際に接続を閉じて再オープンするのではなく、間違った値を返すのではないかと疑問に思っています。 – Tridus
@Tridus、あなたが提案するAssertは、 'Open'の期待される結果を返します。 – GWB
これは古い投稿ですが、私はJulia Lermanの本を読んでいました。使用する構文はcontext.Connection.Open()です(つまり、コンテキストとConnectionの間のデータベースはありません)。ちょっとした考え。 – Tod