Клиент Sync Framework должен выиграть сценарий - PullRequest
0 голосов
/ 24 ноября 2011

Я делаю синхронизацию между двумя базами данных SQL Express, одна - сервер, другая - клиент.

У меня есть следующий код, который выполняет синхронизацию:

        /// <summary>
        /// Sync to Providers
        /// </summary>
        /// <param name="localProvider">can be RelationalProvider Proxy !!! (WCF)</param>
        /// <param name="remoteProvider">RelationalProvider Proxy !!! (WCF)</param>
        /// <param name="syncDirectionOrder"></param>
        /// <returns></returns>
        private SyncOperationStatistics SynchronizeProviders(KnowledgeSyncProvider localProvider, KnowledgeSyncProvider remoteProvider, SyncDirectionOrder syncDirectionOrder)
        {
            localProvider.Configuration.CollisionConflictResolutionPolicy = CollisionConflictResolutionPolicy.RenameDestination;
            localProvider.Configuration.ConflictResolutionPolicy = ConflictResolutionPolicy.SourceWins;

            remoteProvider.Configuration.CollisionConflictResolutionPolicy = CollisionConflictResolutionPolicy.RenameSource;
            remoteProvider.Configuration.ConflictResolutionPolicy = ConflictResolutionPolicy.DestinationWins;

            SubscribeResultEvent(localProvider);

            SyncOrchestrator orchestrator = new SyncOrchestrator
            {
                LocalProvider = localProvider,
                RemoteProvider = remoteProvider,
                Direction = syncDirectionOrder
            };

             SyncOperationStatistics stats = orchestrator.Synchronize();
                    return stats;            
        }

Я не знаю почему, но мойserver db всегда win, не имеет значения server * localProvider или RemoteProvider и переписывает данные клиента, но я хочу сделать настройку, что client всегда выигрывает.

Но я не могу понять, как MSSync Framework делает это.

Что мне нужно настроить?

спасибо!

1 Ответ

2 голосов
/ 29 ноября 2011

В Sync Framework вы можете указать политику разрешения конфликтов для поставщиков синхронизации, как описано в MSDN:

Microsoft Sync Framework по умолчанию поддерживает некоторые простые способы разрешения конфликтов. Вы можете настроить политику разрешения конфликтов поставщика, и Sync Framework выполнит для вас разрешение конфликтов. По умолчанию Sync Framework поддерживает следующие пять типов политик разрешения конфликтов.

Источник выигрывает: исходная реплика всегда выигрывает в случае конфликта.

Назначение выигрывает: реплика назначения всегда выигрывает, если есть конфликт.

Слияние: изменения как источника, так и назначения объединены, чтобы сформировать новую версию элемента, которая затем отправляется назначение, которое будет применено.

Журнал: конфликты игнорируются и информация о конфликтующих элементах отправляется событию SaveConflict класс, реализующий INotifyingChangeApplierTarget.

Отсрочка: полностью игнорировать конфликты и магазин назначения не получит информация о конфликтах.

Все эти политики разрешения конфликтов применимы на уровне элемента, но к сеансу применяются только исходные и конечные выигрыши. Политика синхронизации указывается для поставщика путем установки свойства ConflictResolutionPolicy.

destinationProvider.Configuration.ConflictResolutionPolicy = ConflictResolutionPolicy.DestinationWins;

Таким образом, вы не можете указать напрямую, хотите ли вы, чтобы клиент или сервер все время побеждали, потому что это зависит от направления синхронизации данных относительно того, какой поставщик является источником / местом назначения.

Вы также можете написать собственного поставщика и переопределить событие разрешения конфликта, чтобы указать более сложную пользовательскую обработку конфликта. Обсуждение этого можно найти здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/dd317247%28v=VS.85%29.aspx.

...