Отслеживание изменений в сущностях POCO (платформа Entity Framework)

Существуют два способа отслеживать изменения в сущностях POCO (традиционных объектах среды CLR): с помощью прокси-объекта, отслеживающего изменения или с помощью моментального снимка.

Отслеживание изменений с использованием прокси-объектов

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

Отслеживание изменений с использованием моментального снимка

Если создание прокси-объектов отключено, изменения, вносимые в граф объекта, не отслеживаются Entity Framework автоматически по мере внесения. Вместо этого следует использовать метод DetectChanges для регистрации изменений.

При присоединении объекта к контексту объекта создается моментальный снимок значений его свойств. При вызове метода DetectChanges граф присоединенного объекта синхронизируется с ObjectStateManager. Сведения о присоединении объектов см. в разделе Присоединение и отсоединение объектов (платформа Entity Framework). Метод DetectChanges синхронизирует граф объекта с диспетчером состояния, выполняя следующие действия.

  1. Присоединяет новые объекты в графе к контексту объекта. Это происходит при выполнении запроса к основному объекту и создании сопоставления с новым зависимым объектом.

  2. Обновление состояния объектов основывается на сравнении текущих значений свойств с моментальным снимком исходных значений (если такой снимок был создан).

Дополнительные сведения см. в разделе Как обнаружить изменения в сущностях POCO.

Dd456848.note(ru-ru,VS.100).gifПримечание
Если сущность POCO содержит свойство сложного типа, изменения в членах экземпляра сложного типа будут выявлены с помощью моментального снимка, даже если для этой сущности имеется прокси-объект с отслеживанием изменений.Однако, если новый экземпляр сложного типа назначается свойству, изменение свойства отслеживается тем же способом, что и изменение остальных свойств.

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

В силу важности поддержания ObjectStateManager в синхронизированном состоянии с учетом всех изменений в значениях присоединенных сущностей POCO, по умолчанию метод SaveChanges сначала вызывает метод DetectChanges. Если в граф были внесены изменения и предполагается использовать один из следующих методов, перед вызовом SaveChanges рекомендуется вызвать DetectChanges:

См. также

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

Работа с сущностями POCO (платформа Entity Framework)