Hice lo siguiente para que Sync Framework funcione usando WCF con SQL Server 2008
- Seguimiento de cambios habilitado en SQL Server 2008
- Se habilitó el seguimiento de cambios para las mesas que participan en la sincronización
- Se agregó una tabla de metadatos llamada ancla
- Se agregó una tabla para realizar un seguimiento de los ID de los clientes denominada "guid"
- SqlExpressClientSyncProvider usado disponible en el sitio del proyecto codeplex de MSF como proveedor de sincronización de clientes
-
Usé SqlSyncAdapterBuilder para crear adaptadores para tablas que participan en Sync
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); }
-
Se agregaron comandos de anclaje
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;
-
Implementó un servicio WCF utilizando una instancia de DbServerSyncProvider que funciona como proveedor de sincronización del servidor. Tendrá que generar adaptadores de sincronización y configurar el comando de anclaje como se muestra en el paso anterior para el proveedor del servidor también.
[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); }
-
Creó una clase de proxy que implementa ServerSyncProvider para acceder al servicio 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); } }
- Se creó una instancia de SyncAgent y se configuró RemoteProvider con una instancia de clase de proxy que se usa para acceder al servicio WCF. LocalProvider se establece con la instancia de SqlExpressClientSyncProvider
- Se agregaron tablas y grupos de sincronización a la configuración de SyncAgent
- Agente de sincronización.Synchronize()