WCF 数据服务客户端中没有内置的属性级别更改跟踪器,因此我创建了自己的属性更改跟踪器。
在调用者调用后DataServiceContext.SaveChanges()
,我想清除我跟踪的修改属性集合。 我没有看到任何让我知道何时调用 SaveChanges() 的事件或挂钩。与使用派生的 DataServiceContext 隐藏底层 SaveChanges() 相比,是否有任何我遗漏的事件或钩子可以让我更干净地执行此操作?
WCF 数据服务客户端中没有内置的属性级别更改跟踪器,因此我创建了自己的属性更改跟踪器。
在调用者调用后DataServiceContext.SaveChanges()
,我想清除我跟踪的修改属性集合。 我没有看到任何让我知道何时调用 SaveChanges() 的事件或挂钩。与使用派生的 DataServiceContext 隐藏底层 SaveChanges() 相比,是否有任何我遗漏的事件或钩子可以让我更干净地执行此操作?
http://blogs.msdn.com/b/astoriateam/archive/2013/07/26/using-the-new-client-hooks-in-wcf-data-services-client.aspx的钩子当然可以使用绑定到 SaveChanges() 调用。如果保存导致被跟踪实体作为插入或更新推送,则可以在 RequestPipeline 的 OnEntryEnding 挂钩期间访问它们。
例如,我使用相同的钩子从插入/更新请求中删除未更改(干净)的属性:
public BaseContext(Uri serviceRoot, DataServiceProtocolVersion maxProtocolVersion) :
base(serviceRoot, maxProtocolVersion)
{
this.Configurations.RequestPipeline.OnEntryEnding(OnWritingEntryEnding);
}
private static readonly EntityStates[] _statesToPatchIfDirty =
{
EntityStates.Added, EntityStates.Modified
};
/// <summary>
/// Removes unmodified and client-only properties prior to sending an update or insert request to the server.
/// </summary>
protected virtual void OnWritingEntryEnding(WritingEntryArgs args)
{
var editableBase = args.Entity as EditableBase;
if (editableBase != null
&& editableBase.IsDirty
&& _statesToPatchIfDirty.Contains(GetEntityDescriptor(args.Entity).State))
{
var cleanProperties = args.Entry
.Properties
.Select(odp => odp.Name)
.Where(p => !editableBase.IsDirtyProperty(p))
.ToArray();
args.Entry.RemoveProperties(cleanProperties);
}
}
您可以同时将它们从修改后的属性集合中删除。但是,您可能仍希望在 SaveChanges() 周围添加一些处理,以防最终请求出错。
以下来自 WCF 数据服务博客的帖子可能会对您有所帮助: