Ik heb het volgende gedaan om Sync Framework te laten werken met WCF met SQL Server 2008
- Ingeschakeld Wijzigingen bijhouden in SQL Server 2008
- Bijhouden van wijzigingen ingeschakeld voor tabellen die deelnemen aan de synchronisatie
- Een tabel met metagegevens toegevoegd met de naam anker
- Een tabel toegevoegd om client-ID's bij te houden met de naam "guid"
- Gebruikte SqlExpressClientSyncProvider beschikbaar op de codeplex-projectsite van Artsen Zonder Grenzen als Client Sync Provider
-
SqlSyncAdapterBuilder gebruikt om adapters te bouwen voor tabellen die deelnemen aan de 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); }
-
Ankercommando's toegevoegd
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;
-
Een WCF-service geïmplementeerd met behulp van een instantie van DbServerSyncProvider die functioneert als serversynchronisatieprovider. U zult ook synchronisatieadapters moeten genereren en het ankercommando moeten instellen zoals getoond in de vorige stap voor de serverprovider.
[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); }
-
Een proxyklasse gemaakt die ServerSyncProvider implementeert om toegang te krijgen tot de WCF-service
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); } }
- Een instantie van SyncAgent gemaakt en RemoteProvider ingesteld met een instantie van de proxyklasse die wordt gebruikt om toegang te krijgen tot de WCF-service. LocalProvider is ingesteld met instantie van SqlExpressClientSyncProvider
- Tabellen en synchronisatiegroepen toegevoegd aan SyncAgent-configuratie
- SyncAgent.Synchronize()