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)的低保真副本。另请考虑存储三个变更单位(name、state/province 和 country)的高保真副本。高保真副本包含的业务逻辑针对 country 字段检查 state/province 字段,不会存储未通过检查的变更。低保真副本充当源并发送一个 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 命名空间