C# 同步方向未按预期工作

C# 同步方向未按预期工作,c#,microsoft-sync-framework,C#,Microsoft Sync Framework,我有一个使用Microsoft Sync Framework的项目。除了同步方向外,其他一切都正常工作。我根据用户的选择设置同步编排器的同步方向,这取决于它是上载还是下载 编辑: 我上传了一份文件,以便更好地解释情况: 代码: private void RunSynch() { SqlConnection sqlServer=newsqlconnection(GetServerConnectionString()); SqlConnection sqlClient=newsqlconnecti

我有一个使用Microsoft Sync Framework的项目。除了同步方向外,其他一切都正常工作。我根据用户的选择设置同步编排器的同步方向,这取决于它是上载还是下载

编辑:

我上传了一份文件,以便更好地解释情况:

代码:

private void RunSynch()
{
SqlConnection sqlServer=newsqlconnection(GetServerConnectionString());
SqlConnection sqlClient=newsqlconnection(GetClientConnectionString());
SyncOrchestrator SyncOrchestrator=新的SyncOrchestrator();
syncOrchestrator.LocalProvider=新的SqlSyncProvider(strScopeName,sqlClient);
syncOrchestrator.RemoteProvider=新的SqlSyncProvider(strScopeName,sqlServer);
开关(IButInstate)//int常量
{
案例状态上传:
syncOrchestrator.Direction=SyncDirectionOrder.Upload;
打破
案例状态_下载:
syncOrchestrator.Direction=SyncDirectionOrder.Download;
打破
}
((SqlSyncProvider)syncOrchestrator.RemoteProvider).ApplyChangeFailed+=新事件处理程序(RemoteProvider_ApplyChangeFailed);
((SqlSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed+=新事件处理程序(LocalProvider\u ApplyChangeFailed);
syncStats=syncOrchestrator.Synchronize();
}
私有void远程提供程序\u applychangefiled(对象发送方,dbapplychangefiledeventargs e)
{
如果(rdoConflict.SelectedIndex==0)//服务器赢得选项
{
e、 操作=应用操作。继续;
}
其他的
{
e、 Action=ApplyAction.RetryWithForceWrite;
}
}
私有void LocalProvider\u applychangefiled(对象发送方,dbapplychangefiledeventargs e)
{
如果(rdoConflict.SelectedIndex==0)//服务器赢得选项
{
e、 Action=ApplyAction.RetryWithForceWrite;
}
其他的
{
e、 操作=应用操作。继续;
}
}
这里的问题是,即使同步方向仅为下载,客户端更改也会更新服务器数据库

固定的:


我终于让它工作了。同步框架完全没有问题,但它是分配方向的开关部分,我调试后发现程序没有通过开关盒,这就是为什么方向总是双向的。

我终于找到了原因:

第一次同步数据库时发生的情况

如果它们都有不同的数据,那么所有的行都会冲突

在发生冲突的情况下,默认情况下服务器也会赢(您可以将其更改为远程赢)

所以所有的更改都是远程的,这就是为什么你怀疑同步框架是错误的

原因:

稍后,在服务器获胜的同时更改远程数据库和中央数据库,从而发生一些冲突

更新:

与您的提供商一起使用:

localProvider.ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(LocalProvider_ApplyChangeFailed);
remoteProvider.ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(RemoteProvider_ApplyChangeFailed);


private void LocalProvider_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
    {


     // Need to right your conditions like 
        e.Action = ApplyAction.Continue;

    }
localProvider.applychangefiled+=neweventhandler(localProvider\u applychangefiled);
remoteProvider.ApplyChangeFailed+=新事件处理程序(remoteProvider\u ApplyChangeFailed);
私有void LocalProvider\u applychangefiled(对象发送方,dbapplychangefiledeventargs e)
{
//需要纠正你的状况,比如
e、 操作=应用操作。继续;
}

请为我们提供一些您在下载场景中实现的代码,客户端从不向服务器发送数据。你能做一个简单的测试,订阅本地提供商的ChangesSelected事件,看看它是否真的在你的下载场景中触发(应该不会),我现在终于开始工作了。同步框架完全没有问题,但它是分配方向的开关部分,我调试后发现程序没有通过开关盒,这就是为什么方向总是双向的。这真让人难堪。对不起,伙计们,谢谢你们的帮助!我在这个问题上完全发呆了:)冲突的默认行为是ApplyAction。Continue,这基本上意味着忽略冲突,不应用更改。在上传场景中,这意味着目标或远程将不会更改。在下载中,这意味着保留本地副本。只有对两个源进行更改时才会发生冲突吗?当我将记录同步到客户端,然后对客户端的记录进行更改,然后我同步(下载方向)并且服务器上没有记录更改时,服务器上的记录将由客户端的记录更新。这真的应该发生吗?我认为下载方向只会应用服务器上的更改,但它似乎将更改从客户端应用到服务器。当记录在两侧更改时,冲突总是会发生,您需要处理它。仅供参考,我不使用int ID作为主键,最好使用GUID等。这是同步的必要条件之一。如果数据只在一侧更改,例如客户端,然后我从服务器下载,没有任何更改。服务器上的“我的记录”已更新,请查看是否令人困惑--在同步一次后插入新记录时,没有冲突,但如果主键发现的同一条记录被更改,则存在冲突。Fo new Inserts同步框架工作正常
localProvider.ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(LocalProvider_ApplyChangeFailed);
remoteProvider.ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(RemoteProvider_ApplyChangeFailed);


private void LocalProvider_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
    {


     // Need to right your conditions like 
        e.Action = ApplyAction.Continue;

    }