Ho eseguito le seguenti operazioni per far funzionare Sync Framework utilizzando WCF con SQL Server 2008
- Abilitato il rilevamento delle modifiche in SQL Server 2008
- Abilitato il rilevamento delle modifiche per le tabelle che partecipano alla sincronizzazione
- Aggiunta una tabella di metadati denominata anchor
- Aggiunta una tabella per tenere traccia degli ID client denominata "guid"
- SqlExpressClientSyncProvider usato disponibile dal sito del progetto codeplex di MSF come Client Sync Provider
-
Utilizzato SqlSyncAdapterBuilder per creare adattatori per le tabelle che partecipano alla sincronizzazione
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); }
-
Aggiunti comandi di ancoraggio
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;
-
Implementato un servizio WCF usando un'istanza di DbServerSyncProvider che funge da provider di sincronizzazione del server. Dovrai generare adattatori di sincronizzazione e impostare il comando di ancoraggio come mostrato nel passaggio precedente anche per il provider del server.
[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); }
-
Creata una classe proxy che implementa ServerSyncProvider per accedere al servizio 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); } }
- Creata un'istanza di SyncAgent e impostato RemoteProvider con un'istanza di classe proxy che viene utilizzata per accedere al servizio WCF. LocalProvider è impostato con l'istanza di SqlExpressClientSyncProvider
- Aggiunte tabelle e gruppi di sincronizzazione alla configurazione di SyncAgent
- SyncAgent.Synchronize()