Jeg gjorde følgende for at få Sync Framework til at fungere ved hjælp af WCF med SQL Server 2008
- Aktiveret ændringssporing i SQL Server 2008
- Aktiveret ændringssporing for tabeller, der deltager i synkroniseringen
- Tilføjede en metadatatabel med navnet anker
- Tilføjede en tabel for at spore klient-id'er med navnet "guid"
- Brugt SqlExpressClientSyncProvider tilgængelig fra MSF's codeplex-projektwebsted som Client Sync Provider
-
Brugte SqlSyncAdapterBuilder til at bygge adaptere til tabeller, der deltager i 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); }
-
Tilføjede ankerkommandoer
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;
-
Implementerede en WCF-tjeneste ved hjælp af en instans af DbServerSyncProvider, der fungerer som serversynkroniseringsudbyder. Du skal generere synkroniseringsadaptere og indstille ankerkommando som vist i forrige trin for serverudbyder også.
[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); }
-
Oprettet en proxy-klasse, der implementerede ServerSyncProvider for at få adgang til WCF-tjenesten
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); } }
- Oprettede en forekomst af SyncAgent og indstillede RemoteProvider med en forekomst af proxyklasse, som bruges til at få adgang til WCF-tjenesten. LocalProvider er indstillet med forekomst af SqlExpressClientSyncProvider
- Tilføjede tabeller og synkroniseringsgrupper til SyncAgent-konfigurationen
- SyncAgent.Synchronize()