Cómo: Utilizar la carga diferida para cargar objetos relacionados (Entity Framework)

En este tema se muestra cómo utilizar la carga diferida para cargar objetos relacionados. Con la carga diferida habilitada, los objetos relacionados se cargan cuando se obtiene acceso a ellos a través de una propiedad de navegación. Todavía puede cargar objetos rápidamente con el método Include o cargarlos explícitamente con el método LoadProperty. Para obtener más información, vea Cargar objetos relacionados (Entity Framework).

En el motor de ejecución de Entity Framework , el valor predeterminado de la propiedad LazyLoadingEnabled de una instancia de ObjectContext es false. Sin embargo, si utiliza las herramientas de Entity Framework para crear un nuevo modelo y las clases generadas correspondientes, el código generado establecerá LazyLoadingEnabled en true en el constructor del contexto de objetos generado.

El ejemplo de este tema se basa en el modelo AdventureWorks Sales. Para ejecutar el código de este tema, debe haber agregado el modelo AdventureWorks Sales al proyecto y haber configurado el proyecto para que use Entity Framework. Para obtener más información, vea Cómo: Usar el Asistente para Entity Data Model (Entity Framework) o Cómo: Configurar manualmente un proyecto de Entity Framework y Cómo: Definir manualmente un modelo Entity Data Model (Entity Framework).

Ejemplo

El siguiente ejemplo muestra diez contactos y permite al usuario seleccionar uno. Según el contacto seleccionado, se cargan sus pedidos relacionados.

Class LazyLoading
    Public Sub EnableLazyLoading()
        Using context As New AdventureWorksEntities()
            ' You do not have to set context.ContextOptions.LazyLoadingEnabled to true 
            ' if you used the Entity Framework to generate the object layer. 
            ' The generated object context type sets lazy loading to true 
            ' in the constructor. 
            context.ContextOptions.LazyLoadingEnabled = True

            ' Display ten contacts and select a contact 
            Dim contacts = context.Contacts.Take(10)
            For Each c In contacts
                Console.WriteLine(c.ContactID)
            Next

            Console.WriteLine("Select a customer:")
            Dim contactID As Int32 = Convert.ToInt32(Console.ReadLine())

            ' Get a specified customer by contact ID. 
            Dim contact = context.Contacts.Where(Function(c) c.ContactID = contactID).FirstOrDefault()

            ' If lazy loading was not enabled no SalesOrderHeaders would be loaded for the contact. 
            For Each order As SalesOrderHeader In contact.SalesOrderHeaders
                Console.WriteLine("SalesOrderID: {0} Order Date: {1} ", order.SalesOrderID, order.OrderDate)
            Next
        End Using
    End Sub
End Class
class LazyLoading
{
    public void EnableLazyLoading()
    {
        using (AdventureWorksEntities context =
            new AdventureWorksEntities())
        {
            // You do not have to set context.ContextOptions.LazyLoadingEnabled to true 
            // if you used the Entity Framework to generate the object layer.
            // The generated object context type sets lazy loading to true
            // in the constructor. 
            context.ContextOptions.LazyLoadingEnabled = true;

            // Display ten contacts and select a contact
            var contacts = context.Contacts.Take(10);
            foreach (var c in contacts)
                Console.WriteLine(c.ContactID);

            Console.WriteLine("Select a customer:");
            Int32 contactID = Convert.ToInt32(Console.ReadLine());

            // Get a specified customer by contact ID. 
            var contact = context.Contacts.Where(c => c.ContactID == contactID).FirstOrDefault();

            // If lazy loading was not enabled no SalesOrderHeaders would be loaded for the contact.
            foreach (SalesOrderHeader order in contact.SalesOrderHeaders)
            {
                Console.WriteLine("SalesOrderID: {0} Order Date: {1} ",
                    order.SalesOrderID, order.OrderDate);
            }
        }
    }
}

Vea también

Tareas

Cómo: Usar rutas de la consulta para dar forma a los resultados (Entity Framework)
Cómo: Cargar explícitamente objetos relacionados (Entity Framework)

Conceptos

Cargar objetos relacionados (Entity Framework)
Cargar entidades POCO relacionadas (Entity Framework)