Поделиться через


EntityCollection<TEntity>.Load(MergeOption) Метод

Определение

Загружает связанные объекты в коллекцию с помощью указанного параметра слияния.

public:
 override void Load(System::Data::Objects::MergeOption mergeOption);
public override void Load (System.Data.Objects.MergeOption mergeOption);
override this.Load : System.Data.Objects.MergeOption -> unit
Public Overrides Sub Load (mergeOption As MergeOption)

Параметры

mergeOption
MergeOption

Указывает, как объекты в этой коллекции должны быть объединены с объектами, которые могли быть возвращены из предыдущих запросов к той же ObjectContext.

Примеры

Этот пример основан на модели Adventure Works Sales. Чтобы запустить код в этом примере, необходимо добавить модель продаж AdventureWorks в проект и настроить проект для использования Entity Framework. Для этого выполните действия, описанные в разделе How to: Manually Configure an Entity Framework Project и How to: Manually Define the Model and Mapping Files.

В этом примере загружаются связанные объекты SalesOrderHeader для сущности Contact.

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

Комментарии

Этот метод вызывает внутренний метод RelatedEnd.ValidateLoad перед загрузкой коллекции, которая проверяет правильность вызова Load. Метод RelatedEnd.ValidateLoad проверяет, что:

  • Существует допустимая ObjectContext.
  • Сущность не в состоянии Deleted.
  • MergeOption для Load должен быть NoTracking, если и только если исходная сущность была NoTracking. Если исходная сущность была получена с любым другим MergeOption, LoadMergeOption может быть что-либо, кроме NoTracking (например, сущность может быть загружена с OverwriteChanges, а параметр Load может быть AppendOnly).
  • Если mergeOptionNoTracking, Load не вызывается для уже загруженной сущности и Load не вызывается в непустую, не отслеживаемую RelatedEnd.

Когда объекты в коллекции уже загружаются в ObjectContext, метод Load принудительно применяет MergeOption, указанный параметром mergeOption. Дополнительные сведения см. в разделе Разрешение удостоверений, управление состоянием и отслеживание изменений.

Чтобы явно загрузить связанные объекты, необходимо вызвать метод Load в связанном конце, возвращаемом свойством навигации. Для связи "один ко многим" вызовите метод Load в EntityCollection<TEntity>. Для связи "один к одному" вызовите Load на EntityReference<TEntity>. При этом данные связанных объектов загружаются в контекст объекта. Вы можете перечислить коллекцию возвращаемых результатов с помощью цикла foreach (For Each...Next в Visual Basic) и условно вызвать метод Load для EntityReference<TEntity> и EntityCollection<TEntity> свойств для каждой сущности в результатах.

Метод Load загружает связанные объекты из источника данных независимо от того, IsLoaded ли true.

Заметка

При вызове метода Load во время перечисления foreach (C#) или For Each (Visual Basic) службы объектов пытаются открыть новое средство чтения данных. Эта операция завершится ошибкой, если вы не включили несколько активных наборов результатов, указав multipleactiveresultsets=true в строке подключения. Вы также можете загрузить результат запроса в коллекцию List<T>. Это закрывает средство чтения данных и позволяет перечислить коллекцию для загрузки ссылочных объектов.

Метод EntityCollection<TEntity>.Load синхронизируется с методом EntityReference<TEntity>.Load.

Применяется к