Существуют ли какие-либо события или хуки для DataServiceContext.SaveChanges()
В клиенте служб данных WCF нет встроенного средства отслеживания изменений уровня свойств, поэтому я создал свой собственный средство отслеживания изменений свойств.
После вызова вызывающего DataServiceContext.SaveChanges()
Я хотел бы очистить мою коллекцию отслеживаемых измененных свойств. Я не вижу никаких событий или хуков, которые позволяют мне знать, когда вызывается SaveChanges(). Существуют ли какие-либо события или перехватчики, которые я пропускаю, которые позволили бы мне сделать это более чисто, чем скрытие базового SaveChanges() с моим производным DataServiceContext?
2 ответа
Крюки на 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() на случай, если окончательный запрос выдаст ошибку.
Сообщение из блога WCF Data Service может помочь вам: