Как использовать отложенную загрузку для загрузки связанных объектов (платформа Entity Framework)

В этом разделе показано использование отложенной загрузки для загрузки связанных объектов. Если отложенная загрузка включена, связанные объекты загружаются при получении доступа к ним через свойство навигации. Тем не менее объекты можно предупредительно загружать с помощью метода Include или загружать их явно с помощью метода LoadProperty. Дополнительные сведения см. в разделе Загрузка связанных объектов (платформа Entity Framework).

В среде выполнения Entity Framework значением по умолчанию для свойства LazyLoadingEnabled в экземпляре ObjectContext является false. Однако, если для создания новой модели и соответствующих формируемых классов используются средства Entity Framework , созданный код присвоит параметру LazyLoadingEnabled значение true в конструкторе созданного контекста объекта.

Пример в этом разделе основан на модели Adventure Works Sales. Чтобы запустить код, используемый в данном разделе, нужно сначала добавить к проекту модель Adventure Works Sales и настроить его для использования платформы Entity Framework. Дополнительные сведения см. в разделе Как использовать мастер моделей EDM (Entity Framework) или Как вручную настроить проект Entity Framework и Как определить модель EDM вручную (Entity Framework).

Пример

В следующем примере отображается десять контактов, из которых пользователь выбирает. В соответствии с выбранным контактом затем загружаются связанные заказы.

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

См. также

Задачи

Как использовать пути запросов для формирования результатов (платформа Entity Framework)
Как явно загружать связанные объекты (платформа Entity Framework)

Основные понятия

Загрузка связанных объектов (платформа Entity Framework)
Загрузка связанных сущностей POCO (платформа Entity Framework)