Управление контекстом службы данных (службы WCF Data Services)

Gg602811.note(ru-ru,VS.100).gifПримечание
Данный раздел описывает новую функциональную возможность в службах WCF Data Services. Новая функциональная возможность поддерживает версию 3 протокола Open Data Protocol и она доступна в качестве обновления для .NET Framework версии 4. Загрузить и установить обновление можно в Центре загрузки Майкрософт.

Класс DataServiceContext инкапсулирует операции, поддерживающие работу с конкретной службой данных. Хотя службы OData не сохраняют состояние, контекст его сохраняет. В связи с этим класс DataServiceContext можно использовать для поддержки состояния клиента между операциями со службой данных, что позволяет реализовать такие стратегии, как управление изменениями. Этот класс также управляет идентификаторами и отслеживает изменения.

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

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

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

Управление параллелизмом

OData поддерживает оптимистичный параллелизм, позволяющий службе данных обнаруживать конфликты обновлений. Поставщик службы данных можно настроить таким образом, что служба данных будет проверять наличие изменений в сущностях с помощью маркера параллелизма. Этот маркер включает одно или несколько свойств типа сущности, проверяемых службой данных для определения, был ли ресурс изменен. Маркеры параллелизма, указанные в заголовке eTag запросов и ответов службы данных, управляются клиентом Службы WCF Data Services . Дополнительные сведения см. в разделе Обновление службы данных (службы WCF Data Services).

Объект DataServiceContext отслеживает изменения, внесенные в объекты, указанные вручную с помощью методов AddObject, UpdateObject и DeleteObject или с помощью объекта DataServiceCollection. При вызове метода SaveChanges клиент отправляет изменения обратно службе данных. SaveChanges может закончиться ошибкой, если изменения данных в клиенте конфликтуют с изменениями в службе данных. В этом случае необходимо запросить сущности повторно, чтобы получить обновленные данные. Чтобы переписать изменения в службе данных, выполните запрос с использованием параметра слияния PreserveChanges. При повторном вызове метода SaveChanges изменения, произведенные в клиенте, будут внесены в службе данных, если в службе данных не производилось других изменений в ресурсах.

Сохранение изменений

Изменения отслеживаются в экземпляре DataServiceContext, но не отправляются на сервер немедленно. После завершения изменений для указанного действия вызовите метод SaveChanges, чтобы передать все изменения в службу данных. По завершении операции SaveChanges возвращается объект DataServiceResponse. Объект DataServiceResponse включает последовательность объектов OperationResponse, которые в свою очередь содержат последовательность экземпляров EntityDescriptor или LinkDescriptor, представляющих сохраненные или ожидаемые изменения. Когда сущность создается или изменяется в службе данных, объект EntityDescriptor включает ссылку на обновленную сущность, включая все значения свойств, сформированные сервером, такие как сформированное значение ProductID в предыдущем примере. Клиентская библиотека автоматически обновляет объект .NET Framework с учетом этих новых значений.

Для успешного выполнения операций вставки и обновления свойству состояния объекта EntityDescriptor или LinkDescriptor, связанного с операцией, присваивается значение Unchanged, а новые значения добавляются с помощью OverwriteChanges. Если операция вставки, обновления или удаления завершается с ошибкой, состояние сущности остается таким же, как до вызова метода SaveChanges, а свойству Error объекта OperationResponse присваивается значение DataServiceRequestException, содержащее сведения об ошибке. Дополнительные сведения см. в разделе Обновление службы данных (службы WCF Data Services).

Задание метода HTTP для обновлений

По умолчанию клиентская библиотека платформы .NET Framework отправляет обновления созданным сущностям в качестве запросов MERGE. Запрос MERGE обновляет выбранные свойства сущности. Однако клиент всегда включает все свойства в запрос MERGE, даже те свойства, которые не изменились. Протокол OData также поддерживает отправку запросов PUT для обновления сущностей. В запросе PUT существующая сущность заменяется новым экземпляром сущности с клиентскими значениями свойств. Чтобы использовать запрос PUT, установите флаг ReplaceOnUpdate напротив перечисления SaveChangesOptions при вызове метода SaveChanges.

Gg602811.note(ru-ru,VS.100).gifПримечание
Логика запроса PUT отличается от логики запроса MERGE, если клиенту неизвестны все свойства сущности. Такое может иметь место во время проекции типа сущности в новый тип на клиенте. Это также может иметь место при добавлении новых свойств в сущность в модели сервисных данных, если свойство IgnoreMissingProperties в контексте DataServiceContext имеет значение true, то есть система будет пропускать такие клиентские ошибки сопоставления. В таких случаях запрос PUT сбросит значения всех неизвестных клиенту свойств по умолчанию.

См. также

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

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

Другие ресурсы

Клиентская библиотека служб WCF Data Services