Eu fiz o seguinte para que o Sync Framework funcionasse usando o WCF com o SQL Server 2008
- Controle de alterações ativado no SQL Server 2008
- Rastreamento de alterações ativado para tabelas que participam da sincronização
- Adicionou uma tabela de metadados chamada âncora
- Adicionou uma tabela para rastrear IDs de cliente chamada "guid"
- Usado SqlExpressClientSyncProvider disponível no site do projeto codeplex de MSF como provedor de sincronização de cliente
-
SqlSyncAdapterBuilder usado para construir adaptadores para tabelas que participam do 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); }
-
Comandos de âncora adicionados
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;
-
Implementou um serviço WCF usando uma instância de DbServerSyncProvider funcionando como provedor de sincronização de servidor. Você também terá que gerar adaptadores de sincronização e definir o comando de âncora conforme mostrado na etapa anterior para o provedor do servidor.
[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); }
-
Criou uma classe de proxy implementando ServerSyncProvider para acessar o serviço 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); } }
- Criado uma instância do SyncAgent e definido RemoteProvider com uma instância da classe proxy que é usada para acessar o serviço WCF. LocalProvider é definido com a instância de SqlExpressClientSyncProvider
- Adicionar tabelas e grupos de sincronização à configuração do SyncAgent
- SyncAgent.Synchronize()