当您通过 WCF 数据服务 客户端库使用开放式数据协议 (OData) 源时,该库会将源中的项转换为客户端数据服务类的实例。 这些数据服务类使用 DataServiceQuery<TElement> 所属的 DataServiceContext 进行跟踪。客户端使用 DataServiceContext 上的方法跟踪所报告的对实体所做的更改。 客户端利用这些方法可跟踪已添加和删除的实体以及您对属性值或对实体实例之间关系的更改。 调用 SaveChanges 方法时,将以基于 REST 的操作的形式将这些跟踪的更改发送回数据服务。
备注
当使用 DataServiceCollection<T> 实例将数据绑定到控件时,对绑定控件中数据所做的更改自动报告给 DataServiceContext。有关更多信息,请参见将数据绑定到控件(WCF 数据服务)。
添加、修改和更改实体
当使用 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);
若要添加实体实例,请调用**“添加服务引用”**对话框生成的 DataServiceContext 类的相应的 AddTo 方法,如下面的示例所示:
' 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 方法或使用上述方法之一,还可以显式定义这些链接。 这些操作将在本主题的后面部分进行讨论。
若要修改现有的实体实例,请首先查询该实体,再对其属性进行必要的更改,然后调用 DataServiceContext 的 UpdateObject 方法,以向客户端库指明它需要发送该对象的更新,如下面的示例所示:
' Mark the customer as updated.
context.UpdateObject(customerToChange)
// Mark the customer as updated.
context.UpdateObject(customerToChange);
若要删除实体实例,请调用 DataServiceContext 的 DeleteObject 方法,如下面的示例所示:
' Mark the product for deletion.
context.DeleteObject(deletedProduct)
// Mark the product for deletion.
context.DeleteObject(deletedProduct);
有关更多信息,请参见如何:添加、修改和删除实体(WCF 数据服务)。
附加实体
通过客户端库,可以保存对实体所做的更新,不必先执行查询来将实体加载到 DataServiceContext。 使用 AttachTo 方法将现有对象附加到 DataServiceContext 中的特定实体集。 然后,可以修改对象,并保存对数据服务的更改。 在下面的示例中,已更改的客户对象附加到上下文,然后在调用 SaveChanges 之前调用 UpdateObject 以便将附加的对象标记为 Modified:
' 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 值的实体对象时,使用采用 etag 参数的 AttachTo(String, Object, String) 方法重载。 然后,使用此 eTag 值在保存对附加对象的更改时检查并发。
有关更多信息,请参见如何:将现有实体附加到 DataServiceContext 中(WCF 数据服务)。
创建并修改关系链接
当使用 AddObject 方法或相应 AddTo 方法(属于 DataServiceContext 类,由添加服务引用对话框生成)添加新实体时,新实体和相关实体之间的任何关系都不会自动定义。
可创建和更改实体实例之间的关系,并让客户端库在数据服务中反映这些更改。 实体之间的关系在模型中定义为关联,DataServiceContext 在上下文中以链接对象的形式跟踪每个关系。 WCF 数据服务提供 DataServiceContext 类的下列方法以创建、修改和删除这些链接:
方法 |
说明 |
---|---|
在两个相关实体对象之间创建新的链接。 调用此方法相当于同时调用 AddObject(String, Object) 和 AddLink(Object, String, Object) 以创建新对象并定义与现有对象的关系。 |
|
在两个相关实体对象之间创建新的链接。 |
|
在两个相关实体对象之间更新现有链接。 SetLink(Object, String, Object) 也可用于删除有零或一对一的基数 (0..1:1)和一对一 (1:1)基数的链接。 为此,可将相关对象设置为 null。 |
|
将上下文跟踪的链接标记为在调用 SaveChanges 方法时删除。 如果通过先删除指向现有对象的链接、再添加指向新的相关对象的链接的方式删除相关对象或更改关系,请使用此方法。 |
|
通知两个实体对象之间的现有链接的上下文。 该上下文假设此关系已在数据服务中存在,且不尝试在您调用 SaveChanges 方法时创建链接。 如果要将对象附加到上下文且还需要附加两者之间的链接,请使用此方法。 如果要定义新关系,则应使用 AddLink。 |
|
停止跟踪上下文中的指定链接。 该方法用于删除一对多 (*:*) 关系。 对于基数为一的关系链接,则必须使用 SetLink(Object, String, Object)。 |
备注
大多数数据服务提供商,包括实体框架提供商,以双向方式对待数据模型中实体之间的关系。例如,Customers 与 Orders 实体之间的关联代表客户与一个或多个订单之间的关系,还代表订单与订单所属的客户之间的关系。如果数据服务提供商不会创建一个新关系的两个方向,您可能需要还调用SetLink(Object, String, Object)方法以及 AddLink(Object, String, Object) 定义关系的两个方向。
下面的示例演示如何使用 AddRelatedObject 方法添加新的与现有 Orders 实体相关的 Order_Detail。 由于新的 Order_Details 对象现在由 DataServiceContext 跟踪,因此所添加的 Order_Details 对象与现有 Products 实体的关系将通过调用 AddLink 方法进行定义:
' Add the new item with a link to the related order.
context.AddRelatedObject(order, "Order_Details", newItem)
// Add the new item with a link to the related order.
context.AddRelatedObject(order, "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 数据服务)。
保存更改
在 DataServiceContext 实例中对更改进行跟踪,但不会将更改立即发送到服务器。 在完成对指定活动的所需更改后,调用 SaveChanges 以将所有更改提交给数据服务。 有关更多信息,请参见管理数据服务上下文(WCF 数据服务)。 还可以使用 BeginSaveChanges 和 EndSaveChanges 方法异步保存更改。 有关更多信息,请参见异步操作(WCF 数据服务)。