次の方法で共有


実行時間の長いオブジェクト コンテキストの接続を管理する方法 (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)