0

Microsoft Sync Framework を使用するプロジェクトがあります。同期方向を除いて、すべてが正常に機能しています。ユーザーの選択に応じて、同期オーケストレーターの同期方向をアップロードまたはダウンロードのいずれかに設定します。

編集:

状況をよりよく説明するために、ドキュメントをアップロードしました。

Google ドキュメント リンク

コード:

private void RunSynch()
{
    SqlConnection sqlServer = new SqlConnection(GetServerConnectionString());
    SqlConnection sqlClient = new SqlConnection(GetClientConnectionString());

    SyncOrchestrator syncOrchestrator = new SyncOrchestrator();
    syncOrchestrator.LocalProvider = new SqlSyncProvider(strScopeName, sqlClient);
    syncOrchestrator.RemoteProvider = new SqlSyncProvider(strScopeName, sqlServer); 

    switch(iButtonState) // int constant
    {
        case STATE_UPLOAD:

            syncOrchestrator.Direction = SyncDirectionOrder.Upload;
            break;

        case STATE_DOWNLOAD:

            syncOrchestrator.Direction = SyncDirectionOrder.Download;
            break;
    }

    ((SqlSyncProvider)syncOrchestrator.RemoteProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(RemoteProvider_ApplyChangeFailed);
    ((SqlSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(LocalProvider_ApplyChangeFailed);

    syncStats = syncOrchestrator.Synchronize();
}



private void RemoteProvider_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
{

    if (rdoConflict.SelectedIndex == 0)// server wins option
    {
        e.Action = ApplyAction.Continue;
    }
    else
    {
        e.Action = ApplyAction.RetryWithForceWrite;
    }
}

private void LocalProvider_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
{
    if (rdoConflict.SelectedIndex == 0) // server wins option
    {
        e.Action = ApplyAction.RetryWithForceWrite;
    }
    else
    {
        e.Action = ApplyAction.Continue;
    }
}

ここでの問題は、同期方向がダウンロードのみの場合でも、クライアントの変更によってサーバー データベースが更新されることです。

修理済み:

私はそれを今ようやく働かせました。同期フレームワークにはまったく問題はありませんでしたが、方向が割り当てられているスイッチ部分です。デバッグしたところ、プログラムがスイッチケースを通過しないことがわかりました。これが、方向が常に双方向である理由です。

4

1 に答える 1

1

私は最終的に理由を得ました:

データベースを初めて同期するときに何が起こっているか。

両方のデータが異なる場合、すべての行が競合します。

また、競合が発生した場合、サーバーは常にデフォルトで優先されます (リモート優先に変更できます)。

したがって、すべての変更がリモートに送信されるため、同期フレームワークが間違っているのではないかと思います。

理由:

後でリモートと中央のデータベースを同時に変更することによっていくつかの競合が発生すると、サーバーが勝ちます

アップデート:

プロバイダーでこれを使用します:

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;

    }
于 2013-02-14T06:48:32.913 に答える