SaveChangeWithChangeUnitsContext.RecordConstraintConflictForChangeUnit メソッド

変更単位が含まれる変更の場合、同期先プロバイダーが同期先レプリカに変更の適用を試みたときに、制約の競合が発生したことを報告します。

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

構文

'宣言
Public Sub RecordConstraintConflictForChangeUnit ( _
    changeUnitChange As ChangeUnitChange _
)
'使用
Dim instance As SaveChangeWithChangeUnitsContext
Dim changeUnitChange As ChangeUnitChange

instance.RecordConstraintConflictForChangeUnit(changeUnitChange)
public void RecordConstraintConflictForChangeUnit (
    ChangeUnitChange changeUnitChange
)
public:
void RecordConstraintConflictForChangeUnit (
    ChangeUnitChange^ changeUnitChange
)
public void RecordConstraintConflictForChangeUnit (
    ChangeUnitChange changeUnitChange
)
public function RecordConstraintConflictForChangeUnit (
    changeUnitChange : ChangeUnitChange
)

パラメーター

  • changeUnitChange
    適用する変更単位と競合する、同期先レプリカの変更単位です。

例外

例外の種類 条件

ArgumentNullException

changeUnitChange が NULL 参照 (Visual Basic では Nothing) です。 です。

ArgumentException

適用する変更で changeUnitChange が見つかりません。

SyncInvalidOperationException

制約の競合または復旧可能なエラーが既にこのオブジェクトに設定されています。

解説

制約の競合は、同期先プロバイダーが同期先レプリカに対して変更の適用を試みたときに、その変更が同期先レプリカの制約に違反している場合に発生します。変更単位の場合、これは通常、変更が同期先レプリカで一部のビジネス ロジックに違反していることを意味します。ビジネス ロジックの競合の例として、name および country という 2 つの変更単位が格納されている、忠実性の低いレプリカを考えてみます。また、name、state/province、および country という 3 つの変更単位が格納されている、忠実性の高いレプリカについても考えてみます。忠実性の高いレプリカには、state/province フィールドを country フィールドと照合するビジネス ロジックが含まれており、この照合に合格しない変更は格納されません。忠実性の低いレプリカは、同期元として機能し、country が "USA" に設定された項目を送信します。同期先プロバイダーは、忠実性の高いレプリカに変更の適用を試みますが、忠実性の高いレプリカでは、項目の state/province フィールドに "British Columbia" が含まれています。そのため、この変更はビジネス ロジックに違反し、state/province フィールドを表す変更単位で制約の競合が発生します。

同期先プロバイダーがこのメソッドを使用して制約の競合を報告すると、変更適用元は、指定された競合に対してアプリケーションが設定した競合解決アクションに従って、競合を解決します。その後、変更適用元は、同期先プロバイダーが解決された競合を同期先レプリカに適用できるように、必要な同期先プロバイダーの呼び出しをディスパッチします。詳細については、「制約の競合の検出および解決」を参照してください。

次の例では、同期先レプリカ内で変更単位を更新できるかどうかを確認します。変更単位を更新できない場合は、変更単位に対して制約の競合が記録されます。

Case SaveChangeAction.UpdateVersionAndData
    If True Then
        ' Update the item store and metadata store for the specified change unit.
        Try
            Dim cuData As String = DirectCast(context.ChangeData, String())(cuChange.ChangeUnitId.GetByteId())

            If _ContactStore.CanUpdateContact(change.ItemId, cuChange.ChangeUnitId, cuData) Then
                _ContactStore.UpdateContactFromSync(change, cuChange, cuData)
            Else
                context.RecordConstraintConflictForChangeUnit(cuChange)

            End If
        Catch ex As Exception
            Dim errData As New RecoverableErrorData(ex)
            context.RecordRecoverableErrorForChangeUnit(cuChange, errData)
        End Try
        Exit Select
    End If
case SaveChangeAction.UpdateVersionAndData:
{
    // Update the item store and metadata store for the specified change unit.
    try
    {
        string cuData = ((string[])context.ChangeData)[cuChange.ChangeUnitId.GetByteId()];

        if (_ContactStore.CanUpdateContact(change.ItemId, cuChange.ChangeUnitId, cuData))
        {
            _ContactStore.UpdateContactFromSync(change, cuChange, cuData);
        }
        else
        {
            context.RecordConstraintConflictForChangeUnit(cuChange);
        }

    }
    catch (Exception ex)
    {
        RecoverableErrorData errData = new RecoverableErrorData(ex);
        context.RecordRecoverableErrorForChangeUnit(cuChange, errData);
    }
    break;
}

参照

リファレンス

SaveChangeWithChangeUnitsContext クラス
SaveChangeWithChangeUnitsContext メンバー
Microsoft.Synchronization 名前空間