C# 同步框架在插入操作时更新注册表
我的作用域只对某些范围的注册表生效, (例如ID介于1和3之间的注册表范围) 因此,假设我在远程数据库上有以下注册表:C# 同步框架在插入操作时更新注册表,c#,.net,microsoft-sync-framework,syncfx,C#,.net,Microsoft Sync Framework,Syncfx,我的作用域只对某些范围的注册表生效, (例如ID介于1和3之间的注册表范围) 因此,假设我在远程数据库上有以下注册表: DbSyncScopeDescription serverScopeDescForBranch = SqlSyncDescriptionBuilder.GetDescriptionForScope("ScopeNamesParaUtilizador", ServerConn); SqlSyncScopeProvisioning bran
DbSyncScopeDescription serverScopeDescForBranch
= SqlSyncDescriptionBuilder.GetDescriptionForScope("ScopeNamesParaUtilizador", ServerConn);
SqlSyncScopeProvisioning branchProvision = new SqlSyncScopeProvisioning(ClientConn, serverScopeDescForBranch);
if (!branchProvision.ScopeExists("ScopeNamesParaUtilizador"))
{
branchProvision.Apply();
}
ID---Name
1---名称1
2--姓名2
3--姓名3
4--姓名4
5---姓名5
在我的客户机上,如果我在id为1、2或3的注册表中进行了更改(与作用域相关),那么同步工作正常
但如果我在客户机数据库中添加一个ID为4的新行,这个注册表将与远程数据库中ID相同的注册表重叠,并引发任何失败事件
为什么会发生这种情况?
由于该ID已存在于远程数据库中,因此应该插入注册表,对吗
这是我的服务器配置:
DbSyncScopeDescription scopeTemplateDesc = new DbSyncScopeDescription(TemplateForNames);
scopeTemplateDesc.UserComment = "Template test";
DbSyncTableDescription NamesDescription =
SqlSyncDescriptionBuilder.GetDescriptionForTable("Names", ServerConn);
scopeTemplateDesc.Tables.Add(NamesDescription);
SqlSyncScopeProvisioning serverTemplate =
new SqlSyncScopeProvisioning(ServerConn, scopeTemplateDesc, SqlSyncScopeProvisioningType.Template);
serverTemplate.Tables["Names"].AddFilterColumn("IDName");
serverTemplate.Tables["Names"].FilterClause = @"[side].[IDName] in
(
1,2,3
)";
try
{
serverTemplate.Apply();
}
catch (Exception)
{
Console.WriteLine("...");
}
// Scope
SqlSyncScopeProvisioning serverDBProvisiong = new SqlSyncScopeProvisioning(ServerConn);
serverDBProvisiong.PopulateFromTemplate("ScopeNamesParaUtilizador", TemplateForNames);
serverDBProvisiong.UserComment = "Scope para o utilizador sincronizar os seus nomes";
if (!serverDBProvisiong.ScopeExists("ScopeNamesParaUtilizador"))
{
try
{
serverDBProvisiong.Apply();
}
catch (Exception) { Console.WriteLine("..."); }
}
此代码适用于本地数据库:
DbSyncScopeDescription serverScopeDescForBranch
= SqlSyncDescriptionBuilder.GetDescriptionForScope("ScopeNamesParaUtilizador", ServerConn);
SqlSyncScopeProvisioning branchProvision = new SqlSyncScopeProvisioning(ClientConn, serverScopeDescForBranch);
if (!branchProvision.ScopeExists("ScopeNamesParaUtilizador"))
{
branchProvision.Apply();
}
这是同步代码:
SqlSyncProvider remoteProvider = new SqlSyncProvider("ScopeNamesParaUtilizador", ServerConn);
SqlSyncProvider localProvider = new SqlSyncProvider("ScopeNamesParaUtilizador", ClientConn);
SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
syncOrchestrator.LocalProvider = localProvider;
syncOrchestrator.RemoteProvider = remoteProvider;
syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
((SqlSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed +=
new EventHandler<DbApplyChangeFailedEventArgs>(SynchronizationBusinessRules_ApplyChangeFailed);
((SqlSyncProvider)syncOrchestrator.RemoteProvider).ApplyChangeFailed +=
new EventHandler<DbApplyChangeFailedEventArgs>(SynchronizationBusinessRules_ApplyChangeFailed);
try
{
SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();
Console.WriteLine("Start Time: " + syncStats.SyncStartTime);
Console.WriteLine("Total Changes Uploaded: " + syncStats.UploadChangesTotal);
Console.WriteLine("Total Changes Downloaded: " + syncStats.DownloadChangesTotal);
Console.WriteLine("Complete Time: " + syncStats.SyncEndTime);
}
catch (Exception ex)
{
}
static void SynchronizationBusinessRules_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
{
Console.WriteLine(e.Conflict.ErrorMessage);
}
SqlSyncProvider remoteProvider=新的SqlSyncProvider(“ScopeNamesParaUtilizador”,ServerConn);
SqlSyncProvider localProvider=新的SqlSyncProvider(“ScopeNamesParautizador”,ClientConn);
SyncOrchestrator SyncOrchestrator=新的SyncOrchestrator();
syncOrchestrator.LocalProvider=LocalProvider;
syncOrchestrator.RemoteProvider=RemoteProvider;
syncOrchestrator.Direction=SyncDirectionOrder.UploadAndDownload;
((SqlSyncProvider)syncOrchestrator.LocalProvider).ApplyChange失败+=
新事件处理程序(SynchronizationBusinessRules\u ApplyChangeFailed);
((SqlSyncProvider)syncOrchestrator.RemoteProvider).ApplyChange失败+=
新事件处理程序(SynchronizationBusinessRules\u ApplyChangeFailed);
尝试
{
SyncOperationStatistics syncStats=syncOrchestrator.Synchronize();
Console.WriteLine(“开始时间:+syncStats.SyncStartTime”);
Console.WriteLine(“上传的总更改数:+syncStats.UploadChangesTotal”);
Console.WriteLine(“下载的总更改数:+syncStats.DownloadChangesTotal”);
Console.WriteLine(“完成时间:+syncStats.SyncEndTime”);
}
捕获(例外情况除外)
{
}
静态无效同步BusinessRules\u ApplyChangeFailed(对象发送方,DbApplyChangeFailedEventArgs e)
{
Console.WriteLine(如Conflict.ErrorMessage);
}
您的客户端和sync不知道服务器中的现有行,因此更改将上载到服务器。该行已经存在,同步将失败(假设id是您的PK),您将得到一个冲突(insert-insert)
您必须处理它并告诉sync如何处理它、从客户端应用行或在服务器中保留行
如果您正在进行同步,那么将标识ID用作PK不是一个好主意。除非您进行ID分区(客户端获得1-100000、客户端2、100001到200000等)是的,ID是我的PK。但是我没有得到插入冲突,本地插入的行与远程数据库中的行重叠显示代码如何同步和处理冲突。另外,您说您在服务器上有记录1-5,您对客户端上的记录1-3进行了更改,1-3从何而来?我用5条记录填充服务器数据库,然后用我的客户端对前3条记录进行加密(受范围影响的记录)。然后,我在客户机数据库中添加了更多ID为4、5等的记录,在对这些新记录进行sincronize之后,引发了任何故障事件,远程记录重叠。我还有另一个问题与此相关,插入记录的存储过程是否也会更新已经存在的记录,这应该首先引发冲突。ApplyChangeFailed事件处理程序的代码在哪里?另外,您可以在详细模式下启用跟踪吗?