実行時間の長いオブジェクト コンテキストの接続を管理する方法 (Entity Framework)
このトピックの例では、実行時間の長いオブジェクト コンテキストから接続を手動で開く方法について説明します。例では、コンテキスト上の Dispose を呼び出すことで、接続が解放されたことを確認する方法も示します。詳細については、「オブジェクト コンテキストの管理 (Entity Framework)」を参照してください。
このトピックの例には、AdventureWorks Sales Model (EDM) が使用されています。この例のコードを実行するには、あらかじめプロジェクトに AdventureWorks Sales Model を追加し、Entity Framework を使用するようにプロジェクトを構成しておく必要があります。具体的な方法については、「Entity Data Model ウィザードを使用する方法 (Entity Framework)」の手順を参照してください。
例
この例では、実行時間の長い ObjectContext によって使用される接続を手動で開いた後、クエリを実行し、変更を保存します。ObjectContext が破棄されると、接続が閉じられます。
' Define the order ID for the order we want.
Dim orderId As Integer = 43661
' Create a long-running context.
Dim advWorksContext As New AdventureWorksEntities()
Try
' Explicitly open the connection.
If Not advWorksContext.Connection.State = ConnectionState.Open Then
advWorksContext.Connection.Open()
End If
' Execute a query to return an order.
Dim order As SalesOrderHeader = _
advWorksContext.SalesOrderHeader.Where( _
"it.SalesOrderID = @orderId", New ObjectParameter("orderId", orderId)) _
.Execute(MergeOption.AppendOnly).First()
' Change the status of the order.
order.Status = 1
' Save changes.
If 0 < advWorksContext.SaveChanges() Then
Console.WriteLine("Changes saved.")
End If
' Load the order's items.
order.SalesOrderDetail.Load()
' Delete the first item.
advWorksContext _
.DeleteObject(order.SalesOrderDetail.First())
' Save changes again.
If 0 < advWorksContext.SaveChanges() Then
Console.WriteLine("Changes saved.")
End If
Catch ex As InvalidOperationException
Console.WriteLine(ex.ToString())
Finally
' Explicitly dispose of the context,
' which closes the connection.
advWorksContext.Dispose()
End Try
// Define the order ID for the order we want.
int orderId = 43661;
// Create a long-running context.
AdventureWorksEntities advWorksContext =
new AdventureWorksEntities();
try
{
if (advWorksContext.Connection.State != ConnectionState.Open)
{
// Explicitly open the connection.
advWorksContext.Connection.Open();
}
// Execute a query to return an order.
SalesOrderHeader order =
advWorksContext.SalesOrderHeader.Where(
"it.SalesOrderID = @orderId", new ObjectParameter("orderId",orderId))
.Execute(MergeOption.AppendOnly).First();
// Change the status of the order.
order.Status = 1;
// Save changes.
if (0 < advWorksContext.SaveChanges())
{
Console.WriteLine("Changes saved.");
}
// Load the order's items.
order.SalesOrderDetail.Load();
// Delete the first item.
advWorksContext
.DeleteObject(order.SalesOrderDetail.First());
// Save changes again.
if (0 < advWorksContext.SaveChanges())
{
Console.WriteLine("Changes saved.");
}
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
// Explicitly dispose of the context,
// which closes the connection.
advWorksContext.Dispose();
}
参照
処理手順
実行時間の長いオブジェクト コンテキストの接続を管理する方法 (Entity Framework)
オブジェクト コンテキストから接続を手動で開く方法 (Entity Framework)