2013-02-14 97 views
0

我有一個使用Microsoft Sync Framework的項目。除了同步方向以外,一切正常。如果上傳或下載,則根據用戶的選擇設置Synch Orchestrator的同步方向。同步方向按預期工作

編輯:

我已經上傳的文件,以更好地說明情況:

google doc link

代碼:

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; 
    } 
} 

這裏的問題是在服務器的數據庫獲取由更新即使同步方向僅爲下載,客戶端也會更改。

固定:

我知道了它終於現在工作。同步框架完全沒有問題,但它的方向分配的開關部分,我調試,發現程序不通過開關的情況下,這就是爲什麼方向總是雙向的。

+0

請提供我們在下載場景中使用了一些代碼 – Moons 2013-02-14 06:38:29

+1

,客戶端永遠不會向服務器發送數據。你可以做一個簡單的測試,訂閱本地提供商的ChangesSelected事件,看看它是否真的在你的下載場景中觸發(它不應該) – JuneT 2013-02-14 11:24:51

+0

我現在終於工作了。同步框架完全沒有問題,但它的方向分配的開關部分,我調試,發現程序不通過開關的情況下,這就是爲什麼方向總是雙向的。這真的很尷尬。對不起,夥計們,感謝所有的幫助!我完全分開了這個:「) – 2013-02-15 01:25:32

回答

1

我最後的原因:

發生了什麼事你第一次同步的數據庫。

如果兩者都有不同的數據,那麼所有的行將會發生衝突。

和衝突服務器的情況下,在默認情況下總是獲勝(你可以將其更改爲遠程WINS)也

因此,所有的變化來遠程和多數民衆whay你想知道的是同步框架是錯誤的。

原因:

後來通過改變遠程和中央數據庫服務器同時贏得

更新時,一些衝突發生:

有了您的供應商使用此:

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; 

    } 
+1

衝突的默認行爲是ApplyAction.Continue,它基本上意味着忽略衝突並且不應用更改。在上載方案中,此測量目標或遠程將不會更改。下載,這意味着保留本地副本 – JuneT 2013-02-14 06:58:54

+0

只有在對兩個源進行更改時才發生衝突當我將記錄同步到客戶端,然後對客戶端的記錄進行更改,然後我同步(下載方向)並且沒有記錄在服務器上發生了變化,服務器上的記錄被來自客戶端的記錄更新,這是否真的發生了?我認爲下載方向將只應用來自服務器的更改,但它似乎將來自客戶端的更改應用到服務器。 – 2013-02-14 07:57:58

+0

當記錄在兩邊都發生變化時,衝突總是會發生,你需要處理它,並且FYI不要使用int ID作爲主鍵,最好使用GUID等。這是同步的必要條件之一 – Moons 2013-02-14 08:06:48

相關問題