Procédure : utiliser le chargement différé pour charger des objets connexes (Entity Framework)
Cette rubrique explique comment utiliser le chargement différé pour charger des objets connexes. Lorsque le chargement différé est activé, les objets connexes sont chargés lorsqu'ils font l'objet d'un accès via une propriété de navigation. Vous pouvez toujours charger des objets de façon anticipée à l'aide de la méthode Include ou les charger de façon explicite à l'aide de la méthode LoadProperty. Pour plus d'informations, consultez Chargement d'objets connexes (Entity Framework).
Dans le runtime Entity Framework , la valeur par défaut de la propriété LazyLoadingEnabled dans une instance d'un objet ObjectContext est false. Toutefois, si vous utilisez les outils Entity Framework pour créer un nouveau modèle et les classes générées correspondantes, le code généré attribue à LazyLoadingEnabled la valeur true dans le constructeur du contexte de l'objet généré.
L'exemple de cette rubrique est basé sur le modèle de vente Adventure Works Sales Model. Pour exécuter le code de cette rubrique, vous devez déjà avoir ajouté le modèle de vente AdventureWorks à votre projet et configuré ce dernier pour qu'il utilise Entity Framework. Pour plus d'informations, consultez Procédure : utiliser l'Assistant EDM (Entity Framework) ou Procédure : configurer manuellement un projet Entity Framework et Procédure : définir manuellement un modèle EDM (Entity Data Model) (Entity Framework).
Exemple
L'exemple suivant présente dix contacts et permet à l'utilisateur d'en sélectionner un. Les commandes chargées dépendent du contact sélectionné.
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);
}
}
}
}
Voir aussi
Tâches
Procédure : utiliser des chemins d'accès de requête pour personnaliser des résultats (Entity Framework)
Procédure : charger explicitement des objets connexes (Entity Framework)
Concepts
Chargement d'objets connexes (Entity Framework)
Chargement d'entités POCO connexes (Entity Framework)