Крючки на http://blogs.msdn.com/b/astoriateam/archive/2013/07/26/using-the-new-client-hooks-in-wcf-data-services-client.aspx конечно, могут быть использованы, чтобы связать в SaveChanges вызова(). Если сохранение приводит к тому, что отслеживаемые объекты вставляются в виде вставки или обновления, они доступны во время захвата OnEntryEnding RequestPipeline.
Например, я использую тот же крюк, чтобы удалить без изменений (чистые) свойства из запроса вставки/обновления:
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() в случае окончательных ошибок запроса.
Мы уже используем конвейеры запроса и ответа на клиенте, но нет достаточных средств для определения, когда произошел переход SaveChanges() с конвейерами. –