Материализация объектов (службы WCF Data Services)

При использовании диалогового окна Добавить ссылку на службу для принятия канала Протокол Open Data Protocol (OData) в клиентском приложении .NET Framework создаются эквивалентные классы данных для каждого из типов сущностей в модели данных, предоставляемых каналом. Дополнительные сведения см. в разделе Формирование клиентской библиотеки службы данных (службы WCF Data Services). Данные сущности, возвращаемые запросом, материализуются в экземпляр одного из созданных классов клиентской службы данных.

Службы Службы WCF Data Services позволяют также определять собственные классы клиентской службы данных, а не использовать формируемые средством классы данных. Это позволяет разработчикам использовать собственные классы данных, также называемые классами данных POCO (Plain Old CLR Object). При использовании этих типов пользовательских классов данных необходимо пометить класс данных атрибутом DataServiceKeyAttribute или DataServiceEntityAttribute и убедиться в том, что имена типов в клиенте совпадают с именами типов в модели данных службы данных.

Материализация сущностей из ответа на запрос

После того как библиотека получает ответное сообщение на запрос, она материализует возвращенные из канала OData данные в экземпляры классов клиентской службы данных, имеющие тип запроса. Обычно общий процесс материализации этих объектов происходит следующим образом.

  1. Клиентская библиотека считывает сериализованный тип из элемента entry в веб-канале ответных сообщений и пытается создать новый экземпляр правильного типа одним из следующих способов.

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

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

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

    • Если установлено свойство ResolveType, вызывается предоставленный делегат для переопределения сопоставления типа по умолчанию, основанного на имени, и вместо этого создается новый экземпляр типа, возвращаемого объектом Func. Если этот делегат возвращает значение null, то создается новый экземпляр запрошенного типа. Для поддержки сценария наследования может потребоваться переопределить сопоставление имени типа по умолчанию, основанное на имени.

  2. Клиентская библиотека считывает из элемента id объекта entry значение URI, которое является значением идентификатора сущности. Если значение MergeOption объекта NoTracking не используется, то значение идентификатора используется для отслеживания объекта в DataServiceContext. Значение идентификатора используется также для обеспечения создания лишь одного экземпляра сущности, даже если сущность возвращается в ответе на запрос несколько раз.

  3. Клиентская библиотека считывает свойства из записи веб-канала и устанавливает соответствующие свойства в только что созданном объекте. Если объект, который имеет то же значение идентификатора, уже присутствует в элементе DataServiceContext, то свойства устанавливаются в соответствии с параметром MergeOption элемента DataServiceContext. Ответ может содержать значения свойств, для которых соответствующее свойство отсутствует в типе клиента. В таком случае выполняемое действие зависит от значения свойства IgnoreMissingProperties элемента DataServiceContext. Если свойство равно true, то отсутствующее свойство не учитывается. В противном случае произойдет ошибка. Значения свойств устанавливаются следующим образом.

    • Скалярным свойствам присваивается соответствующее значение записи ответного сообщения.

    • Сложным свойствам присваивается новый экземпляр сложного типа, принимающий значения свойств сложного типа из ответа.

    • Свойства навигации, которые возвращают коллекцию связанных сущностей, приравниваются к новому или существующему экземпляру коллекции ICollection, где T является типом связанной сущности. Эта коллекция будет пустой, если связанные объекты не загружены в объект DataServiceContext. Дополнительные сведения см. в разделе Загрузка отложенного содержимого (службы WCF Data Services).

      Ee473428.note(ru-ru,VS.100).gifПримечание
      Если созданные классы клиентских данных поддерживают привязку данных, свойства навигации возвращают вместо этого экземпляры класса DataServiceCollection.Дополнительные сведения см. в разделе Привязка данных к элементам управления (службы WCF Data Services).

  4. Возникает событие ReadingEntity.

  5. Клиентская библиотека присоединяет объект к контексту DataServiceContext. Если параметр MergeOption равен NoTracking, объект не присоединяется.

Параметры слияния и разрешение идентификаторов

При исполнении DataServiceQuery сущности в канале ответа материализуются в объекты. Способ материализации сущностей в ответном сообщении в объекты выбирается в зависимости от разрешения идентификаторов и параметра слияния, при котором был произведен запрос. Когда несколько запросов или требований загрузки выполняются в области одного контекста DataServiceContext, клиент Службы WCF Data Services отслеживает только один экземпляр объекта, имеющий определенное значение ключа. Этот ключ, который используется для разрешения идентификаторов, однозначно определяет сущность.

По умолчанию клиент материализует значение в канале ответа в объект только для сущностей, еще не отслеживаемых в контексте DataServiceContext. Это означает, что изменения в объектах, уже находящихся в кэше, не перезаписываются. Это поведение управляется указанием значения параметра MergeOption для запросов и операций загрузки. Этот параметр указывается установкой свойства MergeOption в DataServiceContext. Значение параметра слияния по умолчанию равно AppendOnly. В этом случае материализуются только объекты для еще неотслеживаемых сущностей, то есть существующие объекты не перезаписываются. Еще один способ предотвратить перезапись изменений объектов в клиенте при получении обновлений из службы данных состоит в указании параметра PreserveChanges. При указании параметра OverwriteChanges значения объектов в клиенте заменяются новейшими значениями из записей в канале ответа, даже если в эти объекты уже были внесены изменения. При использовании параметра слияния NoTracking DataServiceContext не может отправлять изменения, внесенные в объекты клиента, в службу данных. При выборе этого параметра, изменения всегда перезаписываются значениями из службы данных.

См. также

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

Запросы к службе данных (службы WCF Data Services)
Проекции запросов (службы WCF Data Services)