Направих следното, за да накарам Sync Framework да работи с WCF с SQL Server 2008
- Активирано проследяване на промените в SQL Server 2008
- Активирано проследяване на промените за таблици, участващи в синхронизирането
- Добавена е таблица с метаданни, наречена anchor
- Добавена е таблица за проследяване на идентификатори на клиенти, наречена „guid“
- Използван е SqlExpressClientSyncProvider, наличен от сайта на MSF codeplex проект като доставчик на синхронизиране на клиенти
-
Използван е SqlSyncAdapterBuilder за изграждане на адаптери за таблици, участващи в 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); }
-
Добавени команди за закрепване
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;
-
Внедрена WCF услуга, използваща екземпляр на DbServerSyncProvider, функциониращ като доставчик на синхронизиране на сървъра. Ще трябва да генерирате адаптери за синхронизиране и да зададете команда за закрепване, както е показано в предишната стъпка и за доставчик на сървър.
[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); }
-
Създаден прокси клас, внедряващ ServerSyncProvider за достъп до 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); } }
- Създаден екземпляр на SyncAgent и зададен RemoteProvider с екземпляр на прокси клас, който се използва за достъп до услугата WCF. LocalProvider е зададен с екземпляр на SqlExpressClientSyncProvider
- Добавени са таблици и групи за синхронизиране към конфигурацията на SyncAgent
- SyncAgent.Synchronize()