我正在使用Microsoft Sync Framework来同步两个SQLServer数据库。我创建了同步作用域并将其应用于数据库。在第一次同步期间,源数据库中的所有记录均已在目标数据库中正确创建。如果我添加新记录或更新现有记录,则同步框架还将更改应用于我的目标数据库。现在,我想通过添加另一列来更改同步范围。为了实现这一目标,我删除了现有范围,并创建了一个新的范围,并添加了其他列。像以前一样,同步可以应用每条新记录,但是我在更新现有记录时发现了一些问题。由于我添加了新的同步作用域,因此记录更新仅适用于添加新作用域之后创建的记录,但是旧记录将被忽略。
SyncOrchestrator返回同步统计信息,在这里我可以看到行数,在其中可以跟踪检测到的更改。 例如:如果我更改了2条记录,则在“新”作用域之后添加了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();
}