0

我正在使用以下代码示例 (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  ; 

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

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

4

3 回答 3

3

当本地提供商上应用冲突时,本地提供商上的 ApplyChangeFailed 事件会触发

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

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

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

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

请参阅:如何:处理数据库同步的数据冲突和错误 (SQL Server)

于 2013-01-04T04:12:27.647 回答
0

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

于 2013-01-07T03:22:40.080 回答
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;
       }
于 2013-01-04T04:35:38.883 回答