Object Services の接続の管理 (Entity Framework)
既定では、Object Services は、データベースへの接続を管理します。Object Services では、クエリを実行する場合や SaveChanges を呼び出す場合など、必要な場合にのみ接続が開かれます。接続は、操作が完了したときに閉じられます。
以下のいずれかのメソッドを呼び出すと接続が開きます。
ObjectContext に対する SaveChanges、または Refresh。
ObjectQuery に対する FirstOrDefault、または First。
EntityCollection に対する Load。
EntityReference に対する Load。
任意の統合言語クエリ (LINQ) メソッドまたは ObjectQuery クエリ ビルダ メソッド (Where、OrderBy、Select など)。
[!メモ]
クエリ メソッドが呼び出されると、接続が開きます。接続は、ObjectResult が完全に消費されるか破棄されるまで開いたままになります。
Object Services は、Connection プロパティを使用して EntityConnection を公開します。このため、接続とトランザクションを管理することや、独自の EntityConnection を提供することが可能です。これは、パフォーマンスの向上またはトランザクションの明示的な制御を行うために、実行時間が短いオブジェクト コンテキスト内の接続を開いたままにする場合に便利です。エンティティ フレームワーク で使用された同一のプロバイダ接続は、アプリケーションの他の部分と共有できます。
接続を管理する際は、次の点に注意してください。
操作の前に接続が既に開いていない場合、オブジェクト コンテキストによって接続が開かれます。オブジェクト コンテキストによって操作中に接続が開かれた場合、接続は操作が完了したときに閉じられます。
手動で接続を開いた場合、オブジェクト コンテキストによって接続が閉じられることはありません。Close または Dispose を呼び出すと接続が閉じます。
オブジェクト コンテキストによって接続が作成された場合、接続は、コンテキストが破棄されたときに破棄されます。
実行時間が長いオブジェクト コンテキストの場合、コンテキストが不要になったらコンテキストを破棄する必要があります。
オブジェクト コンテキストに EntityConnection を提供した場合は、確実に破棄する必要があります。
次の例は、接続を明示的に開く方法を示します。
' Explicitly open the connection.
advWorksContext.Connection.Open()
// Explicitly open the connection.
advWorksContext.Connection.Open();
詳細については、「オブジェクト コンテキストから接続を手動で開く方法 (Entity Framework)」を参照してください。
実行時間の長いオブジェクト コンテキスト内で接続を手動で開いた場合は、コンテキストが不要になったときに Dispose を呼び出して接続を確実に閉じる必要があります。また、EntityConnection に対して Close を呼び出して接続を閉じることもできます。詳細については、「実行時間の長いオブジェクト コンテキストの接続を管理する方法 (Entity Framework)」を参照してください。
Object Services では、EntityConnection を作成して、その接続をオブジェクト コンテキストに提供することもできます。その場合、手動で接続を開くか、必要なときにオブジェクト コンテキストで接続を開くことができます。オブジェクト コンテキストに EntityConnection を提供した場合、コンテキストと EntityConnection が不要になった場合、これらを両方とも破棄する必要があります。次の例では、接続を作成してオブジェクト コンテキストに渡します。
' Create an EntityConnection.
Dim conn As New EntityConnection("name=AdventureWorksEntities")
' Create a long-running context with the connection.
Dim advWorksContext As New AdventureWorksEntities(conn)
// Create an EntityConnection.
EntityConnection conn =
new EntityConnection("name=AdventureWorksEntities");
// Create a long-running context with the connection.
AdventureWorksEntities advWorksContext =
new AdventureWorksEntities(conn);
詳細については、「オブジェクト コンテキストで EntityConnection を使用する方法 (Entity Framework)」を参照してください。