Microsoft Sync Framework - обновление записей - PullRequest
0 голосов
/ 15 мая 2019

Я использую 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();
        }

...