Condividi tramite


How to: Manage the Connection in a Long-Running Object Context (Entity Framework)

This topic provides an example of how to manually open a connection for a long-running object context. The example also shows how to ensure that the connection is released by calling Dispose on the context. For more information, see Managing the Object Context (Entity Framework).

The example in this topic is based on the AdventureWorks Sales Model (EDM). To run the code in this example, you must have already added the AdventureWorks Sales Model to your project and configured your project to use the Entity Framework. To do this, complete the procedure in How to: Use the Entity Data Model Wizard (Entity Framework).

Example

This example manually opens the connection used by a long-running ObjectContext, then executes a query and saves the changes. The connection is closed when the ObjectContext is disposed.

' Define the order ID for the order we want.
Dim orderId = 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();
}

See Also

Tasks

How to: Manage the Connection in a Long-Running Object Context (Entity Framework)
How to: Manually Open the Connection from the Object Context (Entity Framework)