2013-01-04 3 views
0

Je développe une application de synchronisation N-Tier en utilisant l'exemple de code suivant (http://code.msdn.microsoft.com/Database-SyncSQL-Server-e97d1208) et en travaillant sur la résolution de conflit.Résolution de conflit Sync Framework

Pour résoudre le conflit, j'utilise l'événement syncProvider.ApplyChangeFailed Pour le fournisseur de synchronisation locale et le fournisseur de synchronisation à distance.

L'événement syncProvider.ApplyChangeFailed n'est pas déclenché par le fournisseur de synchronisation local. Chose intéressante est ce feu même sur le fournisseur proxy distant.

Aussi j'ai essayé avec

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

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

Mais jusqu'à présent, pas de chance.

J'apprécie grandement que quelqu'un puisse me guider sur ce problème.

Répondre

3

l'événement ApplyChangeFailed sur les incendies de fournisseur local quand il y a un conflit sur l'application du fournisseur local

l'événement ApplyChangeFailed le fournisseur à distance est tiré quand il y a un conflit sur le fournisseur distant.

ce qui signifie qu'ils seront déclenchés séparément. un conflit sur le côté distant ne déclenchera pas l'événement ApplyChangeFailed des fournisseurs locaux et vice versa.

SqlSyncProvider ne vous permet pas de définir la stratégie de résolution de conflit via la propriété Configuration. Si vous regardez la documentation, elle indique clairement que la propriété Configuration n'est pas implémentée par le RelationalSyncProvider dont hérite le SqlSyncProvider.

Pour définir la résolution de conflit, vous devez le faire dans l'événement ApplyChangeFailed. Pour chaque conflit, vous pouvez définir la propriété Action sur la résolution de conflit correspondante souhaitée.

voir: How to: Handle Data Conflicts and Errors for Database Synchronization (SQL Server)

+0

Merci pour la réponse. J'ai testé le scénario ci-dessous pour la ligne de données en conflit 1. SyncDirectionOrder.Upload: cela déclenche l'événement dans le fournisseur distant et peut résoudre le conflit. 2. SyncDirectionOrder.Download: ceci ne déclenche pas le conflit dans le fournisseur local. mais il devrait tirer. – Mahesh

+0

pour votre 2e scénario, avez-vous mis à jour les lignes locales et distantes avant la synchronisation? – JuneT

+0

Oui j'ai dID. Je mets à jour les lignes avec des valeurs différentes dans le serveur sql local et distant. – Mahesh

0

Voici mon code source pour init fournisseur SqlSync. Pourriez-vous s'il vous plaît gude moi est-il un problème avec l'initiation

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; 
     } 
0

Merci pour les réponses et toutes les aides. J'ai découvert le problème. Ma base de données de fournisseur local était une base de données polluée qui exécutait la portée de synchronisation differnt. J'ai pris la nouvelle base de données et exécuter la synchronisation et testé pour la résolution des conflits. tout bon. Appliquer l'événement FireChangeFailed sans problème.