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 プロパティを使用して競合解決ポリシーを設定することはできません。ドキュメントを見ると、SqlSyncProvider の継承元である RelationalSyncProvider によって Configuration プロパティが実装されていないことが明確に示されています。

競合解決を設定するには、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 に答える