次の方法で共有


INotifyingChangeApplierTarget.SaveItemChange メソッド

派生クラスでオーバーライドされると、項目ストアに項目変更を保存します。

名前空間: Microsoft.Synchronization
アセンブリ: Microsoft.Synchronization (microsoft.synchronization.dll 内)

構文

'宣言
Sub SaveItemChange ( _
    saveChangeAction As SaveChangeAction, _
    change As ItemChange, _
    context As SaveChangeContext _
)
'使用
Dim instance As INotifyingChangeApplierTarget
Dim saveChangeAction As SaveChangeAction
Dim change As ItemChange
Dim context As SaveChangeContext

instance.SaveItemChange(saveChangeAction, change, context)
void SaveItemChange (
    SaveChangeAction saveChangeAction,
    ItemChange change,
    SaveChangeContext context
)
void SaveItemChange (
    SaveChangeAction saveChangeAction, 
    ItemChange^ change, 
    SaveChangeContext^ context
)
void SaveItemChange (
    SaveChangeAction saveChangeAction, 
    ItemChange change, 
    SaveChangeContext context
)
function SaveItemChange (
    saveChangeAction : SaveChangeAction, 
    change : ItemChange, 
    context : SaveChangeContext
)

パラメーター

  • saveChangeAction
    変更に対して実行されるアクションです。
  • change
    保存する項目変更です。
  • context
    適用される変更に関する情報です。

次の例では、SaveItemChange メソッド内で、特に一般的な SaveChangeAction 値の一部を処理しています。

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);
}

プロバイダーが変更単位を使用する場合、SaveItemChange メソッドは、次の例に示すように、削除アクションを処理するためにだけ呼び出されます。

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);
}

参照

リファレンス

INotifyingChangeApplierTarget インターフェイス
INotifyingChangeApplierTarget メンバー
Microsoft.Synchronization 名前空間