Я использую Microsoft Sync Framework для синхронизации двух баз данных SQLServer. Я создал область синхронизации и применил ее к своей базе данных. Во время первой синхронизации все записи из исходной базы данных правильно создаются в целевой базе данных. Если я добавляю новые или обновляю существующие записи, среда синхронизации также применяет изменения к моей целевой базе данных. Теперь я хотел бы изменить мою область синхронизации, добавив еще один столбец. Чтобы добиться этого, я удалил свою существующую область и создал новую с дополнительным столбцом. Как и раньше, синхронизация может применяться к каждой новой записи, но я обнаружил некоторые проблемы при обновлении существующих записей. Поскольку я добавил новую область синхронизации, обновление записей применяется только для записей, созданных «после» добавления новой области, но старые записи игнорируются.
SyncOrchestrator возвращает статистику синхронизации, где я вижу количество строк, где отслеживаются обнаруженные изменения.
Например: если я изменяю 2 записи, добавленные «после» новой области действия, и 2 записи «до», возвращается статистика: обнаружено 4 изменения, применено 4 изменения. Однако в базе данных я вижу изменения только в 2 записях, созданных после применения новой области.
Это правильное поведение платформы синхронизации? Есть ли способ обновить также существующие записи?
private static void CreateScope(string scope, SqlConnection devConnection, SqlConnection prodConnection)
{
Collection<string> customerColumns = new Collection<string>() { "ID", "Email", "Name" };
DbSyncScopeDescription customersScope = new DbSyncScopeDescription(scope);
DbSyncTableDescription customersTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Customers", customerColumns, devConnection);
customersScope.Tables.Add(customersTableDesc);
SqlSyncScopeProvisioning devProvisioning = new SqlSyncScopeProvisioning(devConnection, customersScope);
devProvisioning.Apply();
DbSyncScopeDescription scopeDescription = SqlSyncDescriptionBuilder.GetDescriptionForScope(scope, devConnection);
SqlSyncScopeProvisioning productionProvisioning = new SqlSyncScopeProvisioning(prodConnection, scopeDescription);
productionProvisioning.Apply();
}
private static void DeleteScope(string scope, SqlConnection devConnection, SqlConnection prodConnection)
{
SqlSyncScopeDeprovisioning sqlSyncScopeDeprovisioning = new SqlSyncScopeDeprovisioning(devConnection);
sqlSyncScopeDeprovisioning.DeprovisionScope(scope);
SqlSyncScopeDeprovisioning sqlSyncScopeDeprovisioning2 = new SqlSyncScopeDeprovisioning(prodConnection);
sqlSyncScopeDeprovisioning2.DeprovisionScope(scope);
}
private static void Synchronize(string scope, SqlConnection devConnection, SqlConnection prodConnection)
{
SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
syncOrchestrator.Direction = SyncDirectionOrder.Download;
syncOrchestrator.RemoteProvider = new SqlSyncProvider(scope, devConnection);
syncOrchestrator.LocalProvider = new SqlSyncProvider(scope, prodConnection);
var x = syncOrchestrator.Synchronize();
}