2014-01-07 5 views
2

Нет встроенного в уровня собственности change tracker в клиенте Data Services Client, поэтому я создал свой собственный трекер отслеживания изменений.Есть ли какие-либо события или перехваты для DataServiceContext.SaveChanges()

После вызова вызывающего абонента DataServiceContext.SaveChanges(), я хотел бы очистить мою отслеживаемую коллекцию измененных свойств. I don't see any events or hooks, которые позволяют мне знать, когда вызывается SaveChanges(). Есть ли какие-либо события или перехватчики, которые мне не хватает, что позволит мне сделать это более чисто, чем скрытие базового SaveChanges() с моим производным DataServiceContext?

ответ

0

ниже поста из блога службы WCF Data может быть в состоянии помочь и:

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

+0

Мы уже используем конвейеры запроса и ответа на клиенте, но нет достаточных средств для определения, когда произошел переход SaveChanges() с конвейерами. –

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() в случае окончательных ошибок запроса.