Существуют ли какие-либо события или хуки для 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 может помочь вам:

http://blogs.msdn.com/b/astoriateam/archive/2013/07/26/using-the-new-client-hooks-in-wcf-data-services-client.aspx

Другие вопросы по тегам