DataServiceContext.SaveChanges()是否有任何事件或挂钩?

时间:2014-01-07 14:55:20

标签: c# odata wcf-data-services wcf-data-services-client

WCF数据服务客户端中没有内置的属性级别更改跟踪器,因此我创建了自己的属性更改跟踪器。

调用者调用DataServiceContext.SaveChanges()后,我想清除我跟踪的修改后的属性集合。 I don't see any events or hooks让我知道何时调用SaveChanges()。是否有任何我遗漏的事件或钩子可以让我比使用派生的DataServiceContext隐藏底层的SaveChanges()更干净地做到这一点?

2 个答案:

答案 0 :(得分:2)

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()周围添加一些处理。

答案 1 :(得分:0)