Sync Framework冲突解决方案

时间:2013-01-04 03:59:40

标签: synchronization microsoft-sync-framework

我正在使用以下代码示例(http://code.msdn.microsoft.com/Database-SyncSQL-Server-e97d1208)开发N层同步应用程序,并致力于解决冲突。

要解决冲突我正在使用syncProvider.ApplyChangeFailed事件对于本地同步提供程序和远程同步提供程序。

syncProvider.ApplyChangeFailed事件在本地同步提供程序上不会触发。有趣的是,这甚至是远程代理提供商的火灾。

我也试过

localProvider.Configuration.CollisionConflictResolutionPolicy = CollisionConflictResolutionPolicy.RenameDestination ;
           localProvider.Configuration.ConflictResolutionPolicy = ConflictResolutionPolicy.ApplicationDefined   ;

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

但到目前为止还没有运气。

我非常感谢有人可以指导我解决这个问题。

3 个答案:

答案 0 :(得分:3)

本地提供商处的ApplyChangeFailed事件会在本地提供商处发生冲突时触发

当远程提供程序发生冲突时,会触发远程提供程序上的ApplyChangeFailed事件。

意思是,它们会被单独解雇。远程端的冲突不会导致本地提供者ApplyChangeFailed事件触发,反之亦然。

SqlSyncProvider不允许您通过Configuration属性设置冲突解决策略。如果查看文档,它会明确指出Configuration属性不是由SqlSyncProvider继承的RelationalSyncProvider实现的。

要设置冲突解决方案,您必须在ApplyChangeFailed事件中执行此操作。对于每个冲突,您可以将Action属性设置为您想要的相应冲突解决方案。

请参阅:How to: Handle Data Conflicts and Errors for Database Synchronization (SQL Server)

答案 1 :(得分:0)

这是我的SqlSync提供程序init的源代码。你能不能告诉我启动时有什么问题

public      SqlSyncProvider ConfigureSqlSyncProvider(SqlDatabase database , IList<string> tableNames )
       {
           SqlSyncProvider syncProvider = new SqlSyncProvider();


                   syncProvider.ObjectSchema = Constant.ObjectScehamPrefix;
           syncProvider.ScopeName = (Constant.ScopeName );
             //syncProvider.Configuration.ConflictResolutionPolicy = ConflictResolutionPolicy.SourceWins  ;
           syncProvider.Connection = new SqlConnection( database.ConnectionString );
           DbSyncScopeDescription dbSyncScopeDes = new DbSyncScopeDescription(Constant.ScopeName );
           SqlSyncScopeProvisioning serverConfig = new SqlSyncScopeProvisioning((SqlConnection)syncProvider.Connection);
           serverConfig.ObjectSchema = Constant.ObjectScehamPrefix;



           if(!serverConfig.ScopeExists(Constant.ScopeName ))
           {

              // DbSyncTableDescription newTableDescription = new DbSyncTableDescription("Profile.Address");
               DbSyncTableDescription geoTable = SqlSyncDescriptionBuilder.GetDescriptionForTable(  tableNames[0],
                                                                                            (SqlConnection)
                                                                                            syncProvider.Connection);

               dbSyncScopeDes.Tables.Add(geoTable);
               serverConfig.PopulateFromScopeDescription(dbSyncScopeDes );
               serverConfig.SetCreateTableDefault(DbSyncCreationOption.Skip );
               serverConfig.Apply();
           }

                syncProvider.ApplyChangeFailed += provider_ApplyChangeFailed; 

           return syncProvider;
       }

答案 2 :(得分:0)

感谢您的答案和所有帮助。我发现了这个问题。我的本地提供程序数据库是污染的数据库,它运行不同的同步范围。我已经采用了新的数据库并运行同步并测试冲突解决方案。都好。 ApplyChangeFailed事件触发没有任何问题。