Sync Framework: конфликты не обрабатываются в SimpleSyncProvider - PullRequest
1 голос
/ 03 апреля 2012

Я реализовал FullEnumerationSimpleSyncProvider, который, похоже, не обрабатывает конфликты.

В конструкторе я установил следующие свойства:

this.Configuration.CollisionConflictResolutionPolicy = CollisionConflictResolutionPolicy.ApplicationDefined;
this.Configuration.ConflictResolutionPolicy = ConflictResolutionPolicy.ApplicationDefined;

this.ItemConstraint += new EventHandler<SimpleSyncItemConstraintEventArgs>(OnItemConstraint);
this.ItemConflicting += new EventHandler<SimpleSyncItemConflictingEventArgs>(OnItemConflicting);

Мои обработчики событий для ограниченийи конфликты:

void OnItemConstraint(object sender, SimpleSyncItemConstraintEventArgs e)
{
    e.SetResolutionAction(ConstraintConflictResolutionAction.Merge);
}

void OnItemConflicting(object sender, SimpleSyncItemConflictingEventArgs e)
{
    e.SetResolutionAction(ConflictResolutionAction.Merge);
}

Однако, когда я сообщаю о конфликте в InsertItem (), обработчики событий ограничения / конфликта никогда не вызываются.

public override void InsertItem(
        object itemData, 
        IEnumerable<SyncId> changeUnitsToCreate, 
        RecoverableErrorReportingContext recoverableErrorReportingContext, 
        out ItemFieldDictionary keyAndUpdatedVersion, 
        out bool commitKnowledgeAfterThisItem) {

            // ...snip...

            // Check if it is already there --- name collision
            if (itemAlreadyExists)
            {
                recoverableErrorReportingContext.RecordConstraintError(ConstructDictionary(item.ID));
                keyAndUpdatedVersion = null;
                commitKnowledgeAfterThisItem = false;

                return;
            }

            // ...snip...
}

Я рассчитывал при вызове RecordConstraintErrorFramework синхронизации будет вызывать соответствующий обработчик события после выхода InsertItem.

Любое понимание будет высоко ценится!

1 Ответ

0 голосов
/ 14 апреля 2012

Если вы обрабатываете конфликт параллелизма и устанавливаете для SetResolutionAction значение ConflictResolutionAction.Merge, то вашему провайдеру необходимо реализовать интерфейс ISimpleSyncProviderConcurrencyConflictResolver (ResolveUpdateUpdateConflict, ResolveLocalDellRevelDeflateConfileTatefatelatefatelatefateate).

Если вы обрабатываете конфликт ограничений и задаете для ConstraintConflictResolutionAction значение Merge, RenameDestination или RenameSource, то вашему провайдеру необходимо реализовать интерфейс ISimpleSyncProviderConstraintConflictResolver.

Простой поставщик Microsoft Sync Framework - обработка конфликтов параллелизма

...