我在两个SQL Express DB之间进行同步,一个是服务器,另一个是客户端。
我的下一代码是什么使同步:
/// <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;
}
我不知道为什么但是我的服务器数据库总是胜利,无论服务器是localProvider
还是
RemoteProvider
,并重写客户端数据,但我想设置客户端总是赢的。
但我无法理解MS Sync Framework是如何做到的。
我需要设置什么?
谢谢!
答案 0 :(得分:2)
在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。