![]() |
---|
本主题描述 WCF Data Services 中的新功能。此新功能支持开放式数据协议 (OData) 版本 3,并且作为 .NET Framework 版本 4 的更新提供。可以从 Microsoft 下载中心下载并安装该更新。 |
DataServiceContext 类封装针对指定数据服务支持的操作。尽管 OData 服务是无状态的,但上下文不是。因此,可使用 DataServiceContext 类在数据服务的各个交互之间保持客户端的状态,以支持诸如更改管理之类的功能。该类还对更改的标识和跟踪进行管理。
合并选项和标识解析
当执行 DataServiceQuery 时,响应源中的实体将具体化为对象。有关更多信息,请参见对象具体化(WCF 数据服务)。将响应消息中的项具体化为对象所采用的方式将基于标识解析,并且依赖于执行查询时所依据的合并选项。在单一 DataServiceContext 范围内执行多个查询或加载请求时,WCF 数据服务 客户端将只跟踪具有特定键值的单个对象实例。用于执行标识解析的此键唯一地标识一个实体。
默认情况下,客户端只针对 DataServiceContext 尚未跟踪的实体,将响应源中的项具体化为对象。这意味着不会覆盖缓存中已存在的对象更改。此行为通过为查询和加载操作指定 MergeOption 值进行控制。通过设置 DataServiceContext 的 MergeOption 属性可指定此选项。默认的合并选项值为 AppendOnly。这样将只为尚未进行跟踪的实体具体化对象,这意味着不会覆盖现有对象。防止数据服务中的更新覆盖客户端上的对象更改的另一种方式是指定 PreserveChanges。当指定 OverwriteChanges 时,客户端上对象的值将替换为响应源中对应项的最新值,即使已对这些对象进行了更改也是如此。当使用 NoTracking 合并选项时,DataServiceContext 无法将对客户端对象所做的更改发送到数据服务。使用此选项时,将始终用数据服务中的值覆盖更改。
管理并发
OData 支持使数据服务能够检测更新冲突的乐观并发。可以按这种方式配置数据服务提供程序,使得数据服务能够使用并发标记检查实体是否更改。此标记包含实体类型的一个或多个属性,数据服务通过验证这些属性来确定某个资源是否已更改。并发标记包含在发送给数据服务的请求和从数据服务发出的响应的 eTag 标头中,由 WCF 数据服务 客户端进行管理。有关更多信息,请参见更新数据服务(WCF 数据服务)。
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 之前的状态,并且 OperationResponse 的 Error 属性设置为包含有关该错误的信息的 DataServiceRequestException。有关更多信息,请参见更新数据服务(WCF 数据服务)。
为更新设置 HTTP 方法
默认情况下,.NET Framework 客户端库将更新作为 MERGE 请求发送至现有实体。MERGE 请求将更新实体的选定属性;但客户端始终会在 MERGE 请求中包含所有属性,即使是未更改的属性也包含在内。OData 协议还支持发送 PUT 请求以更新实体。在 PUT 请求中,现有实体实际上将替换为该实体的一个新实例,新实例具有来自客户端的属性值。要使用 PUT 请求,请在调用 SaveChanges 时为 SaveChangesOptions 枚举设置 ReplaceOnUpdate 标志。
![]() |
---|
当客户端不知道实体的所有属性时,PUT 请求的行为会与 MERGE 请求不同。当将某个实体类型投影到客户端上的新类型时,可能会发生这种情况。当新属性已经添加到服务数据模型中的实体中,同时 DataServiceContext 的 IgnoreMissingProperties 属性设置为 true 以忽略这类客户端映射错误时,也会发生这种情况。在这种情况下,PUT 请求会将客户端未知的任何属性重置为默认值。 |
另请参见
概念
更新数据服务(WCF 数据服务)
异步操作(WCF 数据服务)
批处理操作(WCF 数据服务)