gpt4 book ai didi

c# - DataServiceContext.SaveChanges() 是否有任何事件或 Hook

转载 作者:太空宇宙 更新时间:2023-11-03 10:52:17 26 4
gpt4 key购买 nike

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

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

最佳答案

http://blogs.msdn.com/b/astoriateam/archive/2013/07/26/using-the-new-client-hooks-in-wcf-data-services-client.aspx 处的钩子(Hook)当然可以用于绑定(bind)到 SaveChanges() 调用。如果保存导致被跟踪的实体作为插入或更新被推送,那么它们可以在 RequestPipeline 的 OnEntryEnding Hook 期间访问。

例如,我使用相同的 Hook 从插入/更新请求中删除未更改(干净)的属性:

    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() 周围添加一些处理,以防最终请求出错。

关于c# - DataServiceContext.SaveChanges() 是否有任何事件或 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com