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

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

Службы ADO.NET Data Services обеспечивают динамический доступ к данным сущности в формате XML, пригодном для использования в приложениях. Доступ к данным сущностей выполняется через стандартные HTTP-операции REST, такие как GET, PUT и POST. Дополнительные сведения см. в разделе ADO.NET Data Services.

Следующие вопросы актуальны для всех веб-служб или служб WCF, использующих Entity Framework .

  • В процессе двоичной сериализации и контрактной сериализации данных связанные объекты сериализуются вместе с главным объектом. При XML-сериализации связанные объекты не сериализуются. При сериализации сущностей отключите отложенную загрузку. В ходе отложенной загрузки выполняется запрос для каждого свойства навигации связи, к которому выполняется обращение, а двоичный сериализатор и сериализатор контрактов данных WCF получают доступ ко всем свойствам навигации связи. Это может вызвать выполнение большого числа непредвиденных запросов в ходе сериализации. Дополнительные сведения см. в разделе Сериализация объектов (платформа Entity Framework).

  • Рекомендуются службы без сохранения состояния. Службы должны проектироваться таким образом, чтобы контекст объекта поддерживается только в течение обработки запроса или ответа. Порядок обмена сообщениями должен включать достаточно данных, чтобы изменения могли применяться без сохранения объекта или повторного запроса к источнику данных для получения исходного объекта. Например, служба, которая позволяет клиенту обновить объект, должна требовать возвращения обновленного объекта вместе с исходным. Это позволит веб-службе применить изменения к исходному объекту без извлечения исходного объекта из базы данных и его сохранения в памяти. Дополнительные сведения см. в разделе Как применить изменения, выполненные в отсоединенном объекте (платформа Entity Framework).

  • Объекты всегда десериализуются в состоянии Detached. Может потребоваться присоединить или добавить объект в ObjectContext или просто применить изменения свойств к исходному объекту. Дополнительные сведения см. в разделе Присоединение и отсоединение объектов (платформа Entity Framework).

  • После добавления объектов и связей к контексту можно задать новое состояние с помощью ChangeObjectState (например, Added или Modified).

  • Управление параллелизмом и проверкой производится вручную.

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

Антишаблоны

Многоуровневые шаблоны приложений

Сущности с самостоятельным отслеживанием

В приложении Entity Framework контекст объекта отвечает за отслеживание изменений в объектах. Однако, если объект необходимо обработать на другом уровне, где недоступен контекст объекта, придется подумать о том, каким образом изменения будут отслеживаться и возвращаться обратно в контекст объекта. Начиная с четвертой версии платформы .NET Framework, сущности с самостоятельным отслеживанием позволяют отслеживать изменения на любом уровне. Сущность с самостоятельным отслеживанием строится по шаблону Text Template Transformation Toolkit (T4), который создает типы сущности, обладающие возможностью записывать изменения скалярных свойств, сложных свойств и свойств навигации. Дополнительные сведения см. в разделе Работа с сущностями с самостоятельным отслеживанием.

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

Работа с API для разработки многоуровневых приложений

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

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

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

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 для присоединения отсоединенных объектов, а затем соответствующим образом измените состояние.

Следующие методы служат для изменения скалярных значений.

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

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 можно по отдельности считывать или обновлять текущие свойства объекта.

Для изменения состояния сущностей и связей служат следующие методы.

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

ChangeObjectState

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

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

ChangeRelationshipState

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

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

ChangeState

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

SetModifiedProperty

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

Для сохранения изменений в источнике данных служат следующие методы.

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

SaveChanges

Сохраняет все изменения в источнике данных.

Во время материализации объекта событие ObjectMaterialized дает возможность при необходимости получить и задать некоторые сведения, а также подписываться на события.

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

ObjectMaterialized

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

См. также

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

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