INotifyingChangeApplierTarget::SaveItemChange Method
When overridden in a derived class, saves an item change to the item store.
Assembly: Microsoft.Synchronization (in Microsoft.Synchronization.dll)
void SaveItemChange(
SaveChangeAction saveChangeAction,
ItemChange^ change,
SaveChangeContext^ context
)
Parameters
- saveChangeAction
- Type: Microsoft.Synchronization::SaveChangeAction
The action to be performed for the change.
- change
- Type: Microsoft.Synchronization::ItemChange
The item change to save.
- context
- Type: Microsoft.Synchronization::SaveChangeContext
Information about the change to be applied.
The following example shows how to handle some of the most common SaveChangeAction values in the SaveItemChange method.
Public Sub SaveItemChange(ByVal saveChangeAction__1 As SaveChangeAction, ByVal change As ItemChange, ByVal context As SaveChangeContext) Implements INotifyingChangeApplierTarget.SaveItemChange Select Case saveChangeAction__1 ' Update the item store and metadata store when an item is created or updated. Case SaveChangeAction.Create, SaveChangeAction.UpdateVersionAndData If True Then Try _itemStore.UpdateContactFromSync(change, DirectCast(context.ChangeData, String)) Catch ex As Exception Dim errData As New RecoverableErrorData(ex) context.RecordRecoverableErrorForItem(errData) End Try Exit Select End If ' Update only the version of this item in the metadata store. Case SaveChangeAction.UpdateVersionOnly If True Then Try _itemStore.UpdateContactVersion(change.ItemId, change.ChangeVersion) Catch ex As Exception Dim errData As New RecoverableErrorData(ex) context.RecordRecoverableErrorForItem(errData) End Try Exit Select End If ' Delete the item from the item store and store a tombstone for it in the metadata store. Case SaveChangeAction.DeleteAndStoreTombstone If True Then Try _itemStore.DeleteContactFromSync(change.ItemId, change.ChangeVersion) Catch ex As Exception Dim errData As New RecoverableErrorData(ex) context.RecordRecoverableErrorForItem(errData) End Try Exit Select End If ' Neither merging of data nor removing tombstones is supported. Case SaveChangeAction.UpdateVersionAndMergeData, SaveChangeAction.DeleteAndRemoveTombstone If True Then Throw New NotImplementedException() End If Case Else If True Then Throw New ArgumentOutOfRangeException() End If End Select ' Save the knowledge in the metadata store as each change is applied. Saving knowledge as each change is applied is ' not required. It is more robust than saving the knowledge only after each change batch, because if synchronization is interrupted ' before the end of a change batch, the knowledge will still reflect all of the changes applied. However, it is less efficient because ' knowledge must be stored more frequently. Dim knowledge As SyncKnowledge = Nothing Dim forgottenKnowledge As ForgottenKnowledge = Nothing context.GetUpdatedDestinationKnowledge(knowledge, forgottenKnowledge) _itemStore.ContactReplicaMetadata.SetKnowledge(knowledge) End Sub
public void SaveItemChange(SaveChangeAction saveChangeAction, ItemChange change, SaveChangeContext context) { switch (saveChangeAction) { // Update the item store and metadata store when an item is created or updated. case SaveChangeAction.Create: case SaveChangeAction.UpdateVersionAndData: { try { _itemStore.UpdateContactFromSync(change, (string)context.ChangeData); } catch (Exception ex) { RecoverableErrorData errData = new RecoverableErrorData(ex); context.RecordRecoverableErrorForItem(errData); } break; } // Update only the version of this item in the metadata store. case SaveChangeAction.UpdateVersionOnly: { try { _itemStore.UpdateContactVersion(change.ItemId, change.ChangeVersion); } catch (Exception ex) { RecoverableErrorData errData = new RecoverableErrorData(ex); context.RecordRecoverableErrorForItem(errData); } break; } // Delete the item from the item store and store a tombstone for it in the metadata store. case SaveChangeAction.DeleteAndStoreTombstone: { try { _itemStore.DeleteContactFromSync(change.ItemId, change.ChangeVersion); } catch (Exception ex) { RecoverableErrorData errData = new RecoverableErrorData(ex); context.RecordRecoverableErrorForItem(errData); } break; } // Neither merging of data nor removing tombstones is supported. case SaveChangeAction.UpdateVersionAndMergeData: case SaveChangeAction.DeleteAndRemoveTombstone: { throw new NotImplementedException(); } default: { throw new ArgumentOutOfRangeException(); } } // Save the knowledge in the metadata store as each change is applied. Saving knowledge as each change is applied is // not required. It is more robust than saving the knowledge only after each change batch, because if synchronization is interrupted // before the end of a change batch, the knowledge will still reflect all of the changes applied. However, it is less efficient because // knowledge must be stored more frequently. SyncKnowledge knowledge; ForgottenKnowledge forgottenKnowledge; context.GetUpdatedDestinationKnowledge(out knowledge, out forgottenKnowledge); _itemStore.ContactReplicaMetadata.SetKnowledge(knowledge); }
When a provider uses change units, the SaveItemChange method is called only to handle delete actions, as shown in the following example.
Public Sub SaveItemChange(ByVal saveChangeAction__1 As SaveChangeAction, ByVal change As ItemChange, ByVal context As SaveChangeContext) Implements INotifyingChangeApplierTarget.SaveItemChange ' This provider uses change units, so SaveChangeWithChangeUnits is called for all actions except delete actions. If SaveChangeAction.DeleteAndStoreTombstone = saveChangeAction__1 Then ' Delete the item from the item store and store a tombstone for it in the metadata store. Try _ContactStore.DeleteContactFromSync(change.ItemId, change.ChangeVersion) Catch ex As Exception Dim errData As New RecoverableErrorData(ex) context.RecordRecoverableErrorForItem(errData) End Try Else ' SaveChangeWithChangeUnits should be called for all actions other than delete actions. Throw New NotImplementedException("SaveItemChange only handles deletes!") End If ' Use the metadata storage service to save the knowledge as each change is applied. Saving knowledge as each change is applied is ' not required. It is more robust than saving the knowledge only after each change batch, because if synchronization is interrupted ' before the end of a change batch, the knowledge will still reflect all of the changes applied. However, it is less efficient because ' knowledge must be stored more frequently. Dim updatedKnowledge As SyncKnowledge = Nothing Dim updatedForgottenKnowledge As ForgottenKnowledge = Nothing context.GetUpdatedDestinationKnowledge(updatedKnowledge, updatedForgottenKnowledge) _ContactStore.ContactReplicaMetadata.SetKnowledge(updatedKnowledge) End Sub
public void SaveItemChange(SaveChangeAction saveChangeAction, ItemChange change, SaveChangeContext context) { // This provider uses change units, so SaveChangeWithChangeUnits is called for all actions except delete actions. if (SaveChangeAction.DeleteAndStoreTombstone == saveChangeAction) { // Delete the item from the item store and store a tombstone for it in the metadata store. try { _ContactStore.DeleteContactFromSync(change.ItemId, change.ChangeVersion); } catch (Exception ex) { RecoverableErrorData errData = new RecoverableErrorData(ex); context.RecordRecoverableErrorForItem(errData); } } else { // SaveChangeWithChangeUnits should be called for all actions other than delete actions. throw new NotImplementedException("SaveItemChange only handles deletes!"); } // Use the metadata storage service to save the knowledge as each change is applied. Saving knowledge as each change is applied is // not required. It is more robust than saving the knowledge only after each change batch, because if synchronization is interrupted // before the end of a change batch, the knowledge will still reflect all of the changes applied. However, it is less efficient because // knowledge must be stored more frequently. SyncKnowledge updatedKnowledge; ForgottenKnowledge updatedForgottenKnowledge; context.GetUpdatedDestinationKnowledge(out updatedKnowledge, out updatedForgottenKnowledge); _ContactStore.ContactReplicaMetadata.SetKnowledge(updatedKnowledge); }
Show: