2009-11-01 7 views

Répondre

28

j'ai fait ce qui suit pour obtenir Sync Framework de travail en utilisant WCF avec SQL Server 2008

  • Activé Suivi des modifications dans SQL Server 2008
  • changement activé le suivi des tables participant à la synchronisation
  • Ajout d'une méta-données table nommée ancre
  • Ajout d'une table pour suivre les ID client nommés "guid"
  • Utilisé SqlExpressClientSyncProvider disponible sur le site du projet codeplex de MSF en tant que Client Sync Prov Ider
  • Utilisé SqlSyncAdapterBuilder pour construire des adaptateurs pour les tables qui participent à la synchronisation

    foreach (var item in anchorTables) 
    { 
        // Use adapter builder to generate T-SQL for querying change tracking data and CRUD 
        SqlSyncAdapterBuilder builder = new SqlSyncAdapterBuilder(); 
        builder.Connection = new SqlConnection(this.connectionStringFactory.ConnectionString); 
        builder.ChangeTrackingType = ChangeTrackingType.SqlServerChangeTracking; 
        builder.SyncDirection = SyncDirection.Bidirectional; 
        builder.TableName = item.TableName; 
        // Get sync adapters from builder 
        SyncAdapter clientAdapter = builder.ToSyncAdapter(); 
        clientAdapter.TableName = item.TableName; 
        this.clientSyncProvider.SyncAdapters.Add(clientAdapter); 
    } 
    
  • ancre Ajouté commandes

    SqlCommand anchroCommand = 
        new SqlCommand { CommandText = "SELECT @" 
         + SyncSession.SyncNewReceivedAnchor 
         + " = change_tracking_current_version()" }; 
    
    anchroCommand.Parameters.Add("@" 
         + SyncSession.SyncNewReceivedAnchor, SqlDbType.BigInt) 
         .Direction = ParameterDirection.Output; 
    
    this.clientSyncProvider.SelectNewAnchorCommand = anchroCommand; 
    
  • Mis en œuvre un service WCF en utilisant une instance de DbServerSyncProvider fonctionnant en tant que fournisseur de synchronisation du serveur. Vous devrez générer des adaptateurs de synchronisation et définir la commande d'ancrage comme indiqué à l'étape précédente pour le fournisseur de serveur.

    [ServiceContract] 
    public interface ISyncService 
    { 
        [OperationContract] 
        SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession); 
        [OperationContract] 
        SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession); 
        [OperationContract] 
        SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession); 
        [OperationContract] 
        SyncServerInfo GetServerInfo(SyncSession syncSession); 
    } 
    
  • créé une classe proxy mise en œuvre ServerSyncProvider pour accéder au service WCF

    public class DbServerSyncProviderProxy : ServerSyncProvider 
    { 
        SyncServiceProxy.SyncServiceClient serviceProxy = new SyncServiceProxy.SyncServiceClient(); 
        public override SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession) 
        { 
         return serviceProxy.ApplyChanges(groupMetadata, dataSet, syncSession); 
        } 
    } 
    
  • Création d'une instance de SyncAgent et mis RemoteProvider avec une instance de la classe proxy qui est utilisé pour accéder au service WCF. LocalProvider est réglé par exemple de SqlExpressClientSyncProvider
  • tables ont été ajoutées et les groupes de synchronisation à la configuration SyncAgent
  • SyncAgent.Synchronize()
+0

Merci monsieur, que nous avons assez utile. Incroyable à quel point il est simple de se synchroniser à distance en utilisant Sync Framework + WCF. Bon produit! –

+0

Existe-t-il un moyen d'obtenir un exemple de code complet? – MetalLemon

+4

Oui, un exemple de projet pour Sync Framework 2.1 serait génial! – Manni

Questions connexes