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

В Entity Framework объекты могут быть присоединены к контексту объекта или отсоединены от него. Объекты, присоединенные к контексту объекта, отслеживаются и управляются этим контекстом объекта. Контекст объекта не содержит ссылок на отсоединенные объекты, и их ресурсы могут быть возвращены .NET Framework. В данном разделе описывается присоединение и отсоединение объектов, а также содержатся рекомендации по этим операциям.

Присоединение объектов

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

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

Элемент Описание

System.Data.Objects.ObjectSet.AddObject(

или

System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

Добавляет объект со связанными объектами в контекст ObjectContext и устанавливает состояние Added для объектов сущностей. В этом состоянии объекты сущностей не обязательно должны иметь уникальные значения ключа. Ключевым свойствам присваиваются временные значения ключа, которые обновляются значениями, созданными источником данных, после сохранения объектов. После добавления объектов соответствующим образом измените состояние объектов сущностей.

System.Data.Objects.ObjectSet.Attach(

или

System.Data.Objects.ObjectContext.Attach(System.Data.Objects.DataClasses.IEntityWithKey)

и

AttachTo

Добавляет объект в контекст ObjectContext и устанавливает для объекта состояние Unchanged. В состоянии Unchanged платформа Entity Framework считает значения ключа сущности окончательными. Если несколько сущностей определенного типа имеют одно значение ключа, то платформа Entity Framework вызовет исключение. Чтобы избежать появления исключения, используйте метод AddObject для присоединения отсоединенных объектов, а затем соответствующим образом измените состояние.

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

Элемент Описание

ChangeObjectState

Переводит сущность или связь в новое состояние (например, Added или Modified). Это изменение может повлиять на связи, в которых участвует сущность. Например, в случае перехода сущности в состояние Added все неизменившиеся связи также перейдут в состояние Added. Аналогично, если пометить сущность как Modified, то все скалярные значения будут помечены как Modified.

Также можно использовать метод ChangeState класса ObjectStateEntry.

ChangeRelationshipState

Переводит существующую связь между двумя сущностями в указанное состояние. Если между сущностями отсутствует связь, то этот метод создает связь в указанном состоянии. Этот метод не поддерживается для связей, основанных на сопоставлении на основе внешнего ключа. Дополнительные сведения см. в разделе Определение отношений и управление отношениями (платформа Entity Framework).

Также можно использовать метод ChangeObjectState класса ObjectStateEntry.

ChangeState

Этот метод работает аналогично методу ChangeObjectState или ChangeRelationshipState в зависимости от типа ObjectStateEntry: объект или связь.

SetModifiedProperty

Переводит отдельные свойства в состояние Modified. Используйте этот метод, если известно, какие свойства изменились, чтобы не устанавливать для всей сущности состояние Modified.

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

Элемент Описание

System.Data.Objects.ObjectSet.ApplyCurrentValues(

или

System.Data.Objects.ObjectContext.ApplyCurrentValues.String,

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

Если имеется граф с текущими значениями и нужно применить исходные значения, вызовите метод ApplyOriginalValues.

Также можно использовать метод ApplyCurrentValues класса ObjectStateEntry.

System.Data.Objects.ObjectSet.ApplyOriginalValues(

или

System.Data.Objects.ObjectContext.ApplyOriginalValues.String,

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

Также можно использовать метод ApplyOriginalValues класса ObjectStateEntry.

SetModifiedProperty

Переводит отдельные свойства в состояние Modified. Используйте это свойство, если известно, какие свойства изменились, чтобы не устанавливать для всей сущности состояние Modified.

GetUpdatableOriginalValues

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

CurrentValues

Возвращает экземпляр CurrentValueRecord, который представляет текущие значения объекта, связанного с этим объектом ObjectStateEntry. С помощью возвращенного экземпляра CurrentValueRecord можно по отдельности считывать или обновлять текущие свойства объекта.

Рекомендации по присоединению объектов

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

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

  • Если присоединенный объект не существует в источнике данных, он не добавляется в процессе SaveChanges. В этом случае при внесении изменений в свойства на сервере возникает исключение во время SaveChanges. Для добавления объекта используйте методы System.Data.Objects.ObjectSet.AddObject( или System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

    Если присоединяемый объект связан с другими объектами, необходимо явно определить эти связи одним из способов, описанных в разделе Определение отношений и управление отношениями (платформа Entity Framework). Дополнительные сведения см. в разделе Как присоединить связанные объекты (платформа Entity Framework).

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

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

Отсоединение объектов

В приложениях Entity Framework можно отсоединять объекты от контекста объекта. Отсоединение объектов может быть связано с необходимостью сохранения системных ресурсов, поскольку выполнение повторяющихся запросов в одном и том же контексте объекта увеличивает требования к памяти контекста объекта. Можно избежать присоединения объектов к контексту объекта, выполнив запрос с заданным для параметра MergeOption значением NoTracking, либо можно отсоединить объекты, вызвав метод System.Data.Objects.ObjectSet.Detach( или System.Data.Objects.ObjectContext.Detach(System.Object) и передав ссылку на отсоединяемый объект, как показано в следующем примере:

' Detach the first SalesOrderDetail in the collection. 
context.Detach(order.SalesOrderDetails.First())
// Detach the first SalesOrderDetail in the collection.
context.Detach(order.SalesOrderDetails.First());

Рекомендации по отсоединению объектов

Во время отсоединения объектов следует принимать во внимание следующие соображения.

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

  • В независимом сопоставлении сведения о связи для отсоединенных объектов не сохраняются .

  • Сведения о состоянии объекта после его отсоединения не сохраняются. Это относится к отслеживаемым изменениям и временным значениям ключей.

  • Отсоединение объектов не влияет на данные в источнике данных.

  • Во время операции отсоединения не применяются директивы каскадного удаления и справочные ограничения в идентифицирующем отношении.

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

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

В этом разделе

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

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

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

См. также

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

Построение многоуровневых приложений (платформа Entity Framework)