Condividi tramite


Procedura: utilizzare il caricamento lazy per caricare oggetti correlati (Entity Framework)

In questo argomento viene illustrato come utilizzare il caricamento lazy per caricare oggetti correlati. Con il caricamento lazy abilitato, gli oggetti correlati vengono caricati quando ne viene eseguito l'accesso tramite una proprietà di navigazione. È comunque possibile caricare rapidamente oggetti con il metodo Include o caricarli in modo esplicito con il metodo LoadProperty. Per ulteriori informazioni, vedere Caricamento di oggetti correlati (Entity Framework).

Nel runtime di Entity Framework il valore predefinito della proprietà LazyLoadingEnabled in un'istanza dell'oggetto ObjectContext è false. Tuttavia, se si utilizzano gli strumenti di Entity Framework per creare un nuovo modello e le corrispondenti classi generate, il codice generato imposterà l'oggetto LazyLoadingEnabled su true nel costruttore del contesto dell'oggetto generato.

L'esempio incluso in questo argomento è basato sul modello Sales di AdventureWorks. Per eseguire il codice incluso in questo argomento, è necessario avere già aggiunto il modello Sales di AdventureWorks al progetto e avere configurato il progetto per l'utilizzo di Entity Framework. Per ulteriori informazioni, vedere Procedura: utilizzare la Procedura guidata Entity Data Model (Entity Framework) o Procedura: configurare manualmente un progetto di Entity Framework e Procedura: definire manualmente un modello EDM (Entity Framework).

Esempio

Nell'esempio seguente vengono visualizzati dieci contatti e all'utente viene consentito di selezionarne uno. In base al contatto selezionato vengono quindi caricati gli ordini correlati.

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);
            }
        }
    }
}

Vedere anche

Attività

Procedura: utilizzare percorsi di query per influenzare i risultati (Entity Framework)
Procedura: caricare in modo esplicito oggetti correlati (Entity Framework)

Concetti

Caricamento di oggetti correlati (Entity Framework)
Caricamento di entità POCO correlate (Entity Framework)