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


Присоединение объектов (платформа Entity Framework)

Когда запрос выполняется внутри контекста объекта на платформе Entity Framework, возвращаемые объекты автоматически присоединяются к этому контексту объекта. Кроме того, к контексту объекта можно присоединять и объекты, полученные из источников, не являющихся запросами. Присоединять можно ранее отсоединенные объекты, объекты, возвращенные запросом NoTracking, или объекты, полученные вне контекста объекта. Наряду с этим можно присоединять объекты, сохраненные в состоянии представления приложения ASP.NET или возвращенные вызовом удаленного метода либо веб-службой.

Для присоединения объекта к контексту объекта используйте один из следующих методов:

  • Вызовите метод AddObject для ObjectContext с целью добавления объекта к контексту объекта. Это необходимо сделать в том случае, если объект является новым и отсутствует в источнике данных.

  • Вызовите метод Attach для ObjectContext с целью присоединения объекта к контексту объекта. Это необходимо сделать в том случае, если объект уже существует в источнике данных, но в текущий момент не присоединен к этому контексту. Дополнительные сведения см. в разделе Как присоединить связанные объекты (платформа Entity Framework).

  • Необходимо вызвать AttachTo применительно к ObjectContext, чтобы присоединить этот объект к конкретному набору сущностей в контексте объекта. Это следует также сделать, если объект имеет равное null (Nothing в Visual Basic) значение EntityKey.

  • Вызовите метод ApplyPropertyChanges для ObjectContext. Это необходимо сделать, если объект уже существует в источнике данных и отсоединенный объект имеет обновления свойств, которые следует сохранить. Если же объект просто присоединяется, изменения свойств утрачиваются. Дополнительные сведения см. в разделе Как применить изменения к отсоединенному объекту (платформа Entity Framework).

При выполнении операции по присоединению объектов к контексту объекта необходимо помнить о следующих обстоятельствах:

  • Если присоединяемый объект имеет связанные объекты, эти объекты тоже присоединяются к контексту объекта.

  • Чтобы использовать метод Attach для присоединения объекта, последний должен реализовывать объект IEntityWithKey и иметь допустимый ключ.

  • Объекты присоединяются к контексту объекта в состоянии Unchanged.

  • Если присоединенный объект не существует в источнике данных, он не добавляется при выполнении метода SaveChanges. В этом случае при внесении изменений в свойства на сервере возникает исключение во время выполнения метода SaveChanges. Для добавления объекта используйте метод AddObject вместо Attach.

  • Если присоединяемый объект связан с другими объектами, необходимо явно определить эти связи одним из следующих способов:

    • Присоединить оба объекта к контексту объекта и затем вызвать метод Attach для объекта EntityCollection или EntityReference с тем, чтобы определить эту связь.

    • Если же ни один из объектов не присоединяется, нужно вызвать метод Add для EntityCollection и указать связанный объект или задать свойство Value объекта EntityReference связанному объекту. Далее нужно присоединить корневой узел графа объектов к контексту объекта. Этот метод можно использовать для создания графа объектов из отсоединенных объектов с последующим присоединением этого графа к контексту объекта.

    Эти методы используются при присоединении связанных объектов, которые были сериализованы с помощью XML-сериализации. Дополнительные сведения см. в разделе Как присоединить связанные объекты (платформа Entity Framework).

  • Если присоединяемый объект имеет обновленные значения свойств, то для применения обновлений к существующему объекту следует использовать метод ApplyPropertyChanges. Дополнительные сведения см. в разделе Как применить изменения к отсоединенному объекту (платформа Entity Framework).

  • Объект, который передается методу Attach, должен иметь допустимое значение свойства EntityKey. Если объект не имеет допустимого значения свойства EntityKey, используйте метод AttachTo, чтобы указать имя набора сущностей.

  • Возникает исключение InvalidOperationException, если присоединяемый объект имеет то же значение EntityKey, что и другой объект, уже представленный в контексте объекта. Эта ошибка не возникает, если экземпляр того же объекта уже находится в контексте объекта; метод Attach для одного экземпляра объекта можно вызывать несколько раз при условии, что объект находится в состоянии Unchanged.

  • Для присоединения объектов к заданному набору сущностей нужно использовать метод AttachTo. Дополнительные сведения см. в разделе Добавление, изменение и удаление объектов (платформа Entity Framework).

  • Когда для объекта, присоединяемого с помощью метода AttachTo, уже определен ключ сущности, тогда, если значение параметра entitySetName не соответствует имени набора сущностей в существующем ключе, возникает исключение InvalidOperationException.

См. также

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

Отсоединение объектов (платформа Entity Framework)
Веб-службы и модель EDM (сценарии приложений)

Другие ресурсы

Управление контекстом объекта (платформа Entity Framework)