Обновление службы данных (службы WCF Data Services)

При использовании клиентской библиотеки Службы WCF Data Services для доступа к каналу Протокол Open Data Protocol (OData) эта библиотека преобразует записи из канала в экземпляры классов клиентской службы данных. Эти классы службы данных отслеживаются с помощью контекста DataServiceContext, к которому относится DataServiceQuery. Клиент отслеживает изменения сущностей, которые включаются в отчет с помощью методов DataServiceContext. Эти методы позволяют клиенту отслеживать добавленные и удаленные сущности, а также изменения, вносимые в значения свойств или в связи между экземплярами сущностей. При вызове метода SaveChanges отслеженные изменения отправляются назад в службу данных в виде операций, основанных на REST.

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

Добавление, модификация и изменение сущностей

При использовании диалога Добавление ссылки на службу в среде Visual Studio для добавления ссылки на канал OData все классы сформированной в результате этого клиентской службы данных имеют статический метод Create, принимающий один параметр на каждое свойство сущности, не допускающее значения null. Этот метод можно использовать для создания экземпляров классов типа сущности, как показано в следующем примере.

' Create the new product.
Dim newProduct = _
    Product.CreateProduct(0, "White Tea - loose", False)
// Create the new product.
Product newProduct =
    Product.CreateProduct(0, "White Tea - loose", false);

Для добавления экземпляра сущности вызовите соответствующий метод AddTo класса DataServiceContext, сформированного диалоговым окном Добавление ссылки на службу, как показано в следующем примере.

' Add the new product to the Products entity set.
context.AddToProducts(newProduct)
// Add the new product to the Products entity set.
context.AddToProducts(newProduct);

При этом объект добавляется в контекст и в соответствующий набор сущностей. Можно также вызвать метод AddObject, но при этом придется передать имя набора сущностей. Если добавляемая сущность имеет одну или несколько связей с другими сущностями, можно использовать либо метод AddRelatedObject, либо один из предыдущих методов и явно задать эти связи. Эти операции обсуждаются дальше в данном разделе.

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

' Mark the customer as updated.
context.UpdateObject(customerToChange)
// Mark the customer as updated.
context.UpdateObject(customerToChange);

Для удаления экземпляра сущности вызовите метод DeleteObject объекта DataServiceContext, как показано в следующем примере.

' Mark the product for deletion.    
context.DeleteObject(deletedProduct)
// Mark the product for deletion.    
context.DeleteObject(deletedProduct);

Дополнительные сведения см. в разделе Как добавлять, изменять и удалять сущности (службы WCF Data Services).

Присоединение сущностей

Клиентская библиотека позволяет сохранить обновления, произведенные в сущности, без выполнения запроса для загрузки сущности в контекст DataServiceContext. Используйте метод AttachTo для присоединения существующего объекта к определенному набору сущностей в контексте DataServiceContext. Затем этот объект можно изменить и сохранить изменения в службе данных. В следующем примере измененный пользовательский объект присоединяется к контексту, после чего вызывается метод UpdateObject для пометки присоединенного объекта атрибутом Modified перед вызовом метода SaveChanges.

' Attach the existing customer to the context and mark it as updated.
context.AttachTo("Customers", customer)
context.UpdateObject(customer)

' Send updates to the data service.
context.SaveChanges()
// Attach the existing customer to the context and mark it as updated.
context.AttachTo("Customers", customer);
context.UpdateObject(customer);

// Send updates to the data service.
context.SaveChanges();

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

  • Объект присоединяется в состоянии Unchanged.

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

  • Объект не может быть присоединен, если сущность уже отслеживается контекстом.

  • При присоединении объекта сущности, полученной со значением eTag, используется перегруженный метод AttachTo, принимающий параметр etag. Это значение eTag используется для проверки параллелизма при сохранении изменений в присоединенном объекте.

Дополнительные сведения см. в разделе Как присоединить имеющуюся сущность к контексту DataServiceContext (службы WCF Data Services).

Создание и изменение ссылок на связи

При добавлении новой сущности с помощью метода AddObject или соответствующего метода AddTo класса DataServiceContext, формируемого диалогом Добавление ссылки на службу, связи между новой сущностью и связанными сущностями автоматически не определяются.

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

Метод Описание

AddRelatedObject

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

AddLink

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

SetLink

Обновление существующей связи между двумя связанными объектами сущности. SetLink также используется для удаления связей с количеством элементов «один ко многим» (0..1:1) и «один к одному» (1:1). Это можно сделать, задав связанному объекту значение null.

DeleteLink

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

AttachLink

Уведомляет контекст о существовании ссылки между двумя объектами сущностей. Контекст предполагает, что эта связь уже существует в службе данных, и не пытается создать связь при вызове метода SaveChanges. Используйте этот метод при присоединении объектов к контексту, если необходимо также присоединить ссылку между двумя из них. При определении новой связи лучше использовать объект AddLink.

DetachLink

Прекращает отслеживание указанной ссылки в контексте. Этот метод используется для удаления связей «один ко многим» (*:*). Для связей с количеством элементов, равным одному, следует использовать объект SetLink.

Следующий пример иллюстрирует использование метода AddRelatedObject для добавления нового объекта Order_Detail, связанного с имеющейся сущностью Orders. Поскольку новый объект Order_Details отслеживается с помощью метода DataServiceContext, связь добавленного объекта Order_Details с существующей сущностью Products определяется методомAddLink:

' Add the new item with a link to the related order.
context.AddRelatedObject(order, "Order_Details", newItem)

' Since the item is now tracked by the context,
' set just the link to the related product.
context.AddLink(selectedProduct, "Order_Details", newItem)
// Add the new item with a link to the related order.
context.AddRelatedObject(order, "Order_Details", newItem);

// Since the item is now tracked by the context,
// set just the link to the related product.
context.AddLink(selectedProduct, "Order_Details", newItem);

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

' Add the new order detail to the collection, and
' set the reference to the product.
order.Order_Details.Add(newItem)
newItem.Order = order
newItem.Product = selectedProduct
// Add the new order detail to the collection, and
// set the reference to the product.
order.Order_Details.Add(newItem);
newItem.Order = order;
newItem.Product = selectedProduct;

Дополнительные сведения см. в разделе Как определять связи сущностей (службы WCF Data Services).

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

Изменения отслеживаются в экземпляре DataServiceContext, но не отправляются на сервер немедленно. После завершения изменений для указанного действия вызовите метод SaveChanges, чтобы передать все изменения в службу данных. Дополнительные сведения см. в разделе Управление контекстом службы данных (службы WCF Data Services). Изменения можно сохранить и асинхронно с помощью методов BeginSaveChanges и EndSaveChanges. Дополнительные сведения см. в разделе Асинхронные операции (службы WCF Data Services).

См. также

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

Запросы к службе данных (службы WCF Data Services)
Асинхронные операции (службы WCF Data Services)
Пакетные операции (службы WCF Data Services)
Материализация объектов (службы WCF Data Services)
Управление контекстом службы данных (службы WCF Data Services)

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

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