Присоединение объектов (платформа 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 (сценарии приложений)