Esta documentación está archivada y no tiene mantenimiento.

Cómo: Cargar explícitamente objetos relacionados (Entity Framework)

En este tema se proporcionan ejemplos de cómo cargar explícitamente objetos relacionados.

El primer ejemplo usa el método Load en EntityCollection para cargar explícitamente todos los pedidos y artículos de un único cliente. El método Load no se puede utilizar con entidades POCO porque las propiedades de navegación de las entidades POCO no son necesarias para devolver EntityCollection. Para obtener más información, vea Cargar entidades POCO relacionadas (Entity Framework).

El segundo ejemplo usa el método CreateSourceQuery para crear una consulta que carga únicamente pedidos seleccionados con los artículos relacionados. A continuación, estos pedidos se adjuntan al cliente.

También podría utilizar el método LoadProperty de la clase ObjectContext para cargar los objetos relacionados. El método LoadProperty también se puede utilizar con entidades POCO y con entidades derivadas de EntityObject.

Los ejemplos de este tema se basan en el modelo Adventure Works Sales. Para obtener más información, vea Cómo usar el Asistente para Entity Data Model (Entity Framework).

Ejemplo

En el siguiente ejemplo se cargan los objetos SalesOrderHeader que pertenecen a un solo Contact y después recorre los objetos que pertenecen a SalesOrderHeader en EntityCollection. En cada objeto SalesOrderHeader de la colección, se llama al método Load para recuperar la colección de los objetos SalesOrderDetail relacionados de la base de datos.

// Specify the customer ID.
int contactID = 4332;

using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{
    context.ContextOptions.LazyLoadingEnabled = false;

    // Get a specified customer by contact ID.
    var contact =
        (from c in context.Contacts
         where c.ContactID == contactID
         select c).First();

    // Load the orders for the customer explicitly.
    if (!contact.SalesOrderHeaders.IsLoaded)
    {
        contact.SalesOrderHeaders.Load();
    }

    foreach (SalesOrderHeader order in contact.SalesOrderHeaders)
    {
        // Load the items for the order if not already loaded.
        if (!order.SalesOrderDetails.IsLoaded)
        {
            order.SalesOrderDetails.Load();
        }

        Console.WriteLine(String.Format("PO Number: {0}",
            order.PurchaseOrderNumber));
        Console.WriteLine(String.Format("Order Date: {0}",
            order.OrderDate.ToString()));
        Console.WriteLine("Order items:");
        foreach (SalesOrderDetail item in order.SalesOrderDetails)
        {
            Console.WriteLine(String.Format("Product: {0} "
                + "Quantity: {1}", item.ProductID.ToString(),
                item.OrderQty.ToString()));
        }
    }
}

En el ejemplo siguiente se utiliza el método CreateSourceQuery sobre EntityCollection para cargar solo cinco objetos SalesOrderHeader, con los objetos SalesOrderDetail relacionados, que pertenecen a un único Contact. A continuación, este resultado de la consulta se adjunta a la SalesOrderHeaderEntityCollection original.

// Specify the customer ID.
int customerId = 4332;

using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{
    // Get a specified customer by contact ID.
    Contact customer = context.Contacts
        .Where("it.ContactID = @customerId",
        new ObjectParameter("customerId", customerId)).First();

    // Return the customer's first five orders with line items and
    // attach them to the SalesOrderHeader collection.
    customer.SalesOrderHeaders.Attach(
        customer.SalesOrderHeaders.CreateSourceQuery()
        .Include("SalesOrderDetails").Take(5));

    foreach (SalesOrderHeader order in customer.SalesOrderHeaders)
    {
        Console.WriteLine(String.Format("PO Number: {0}",
            order.PurchaseOrderNumber));
        Console.WriteLine(String.Format("Order Date: {0}",
            order.OrderDate.ToString()));
        Console.WriteLine("Order items:");

        foreach (SalesOrderDetail item in order.SalesOrderDetails)
        {
            Console.WriteLine(String.Format("Product: {0} "
                + "Quantity: {1}", item.ProductID.ToString(),
                item.OrderQty.ToString()));
        }
    }
}

Vea también

Mostrar: