J'ai fait ce qui suit pour que Sync Framework fonctionne avec WCF avec SQL Server 2008
- Activation du suivi des modifications dans SQL Server 2008
- Activation du suivi des modifications pour les tables participant à la synchronisation
- Ajout d'une table de métadonnées nommée ancre
- Ajout d'un tableau pour suivre les identifiants client nommé "guid"
- Utilisation de SqlExpressClientSyncProvider disponible sur le site du projet codeplex de MSF en tant que fournisseur de synchronisation client
-
Utilisation de SqlSyncAdapterBuilder pour créer des adaptateurs pour les tables participant à 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); }
-
Ajout de commandes d'ancrage
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;
-
Implémentation d'un service WCF à l'aide d'une instance de DbServerSyncProvider fonctionnant comme fournisseur de synchronisation de serveur. Vous devrez également 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éation d'une classe proxy implémentant 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éé une instance de SyncAgent et défini RemoteProvider avec une instance de classe proxy utilisée pour accéder au service WCF. LocalProvider est défini avec l'instance de SqlExpressClientSyncProvider
- Ajout de tables et de groupes de synchronisation à la configuration de SyncAgent
- SyncAgent.Synchronize()