2010-01-21 116 views
2

我試圖使用Microsoft同步框架同步2 SQL Server 2005數據庫(服務器和客戶端)。數據庫中有多個表格,它們之間有很多外鍵關係。我正在使用SyncOrchestrator來同步兩個數據庫。微軟同步框架問題同步關係數據庫

string clientConnectionString = "<connection string>"; 
string serverConnectionString = "<connection string>"; 

SqlSyncProvider localProvider 
    = ConfigureClientProvider(clientConnectionString); 
SqlSyncProvider remoteProvider 
    = ConfigureServerProvider(serverConnectionString); 

SyncOrchestrator orchestrator = new SyncOrchestrator(); 
orchestrator.LocalProvider = localProvider; 
orchestrator.RemoteProvider = remoteProvider; 
orchestrator.Direction = SyncDirectionOrder.Download; 

在功能ConfigureClientProvider和ConfigureServerProvider我初始化連接,並檢查是否範圍不退出則創建它:

public static SqlSyncProvider ConfigureClientSyncProvider() 
{ 
    SqlSyncProvider provider = new SqlSyncProvider(); 

    provider.Connection = new SqlConnection(Configs.ConnectionString); 


    DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("Test1"); 

    SqlSyncScopeProvisioning serverConfig = new SqlSyncScopeProvisioning(); 

    if (!serverConfig.ScopeExists("Test1", (System.Data.SqlClient.SqlConnection)provider.Connection)) 
    { 
     scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable 
      ("Employees", (SqlConnection)provider.Connection)); 
     scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable 
      ("Profiles", (SqlConnection)provider.Connection)); 
     scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable 
      ("Department", (SqlConnection)provider.Connection)); 


     serverConfig.PopulateFromScopeDescription(scopeDesc); 

     serverConfig.SetCreateTableDefault(DbSyncCreationOption.Skip); 

     serverConfig.Apply((System.Data.SqlClient.SqlConnection)provider.Connection); 
    } 

    return provider; 
} 

現在,當我嘗試運行同步其工作正常更新的數據,但在數據庫中存在任何插入或刪除操作時,我遇到了外鍵問題。例如

INSERT語句衝突與 外鍵約束 「FK_Employees_Departments」。該 衝突發生於數據庫 「Sync_Client」,表 「dbo.Departments」,列 'DepartmentID的'。

如果我按照表格的順序做一些改變,那麼我能夠解決一個由於刪除而出現的另一種情況。

DELETE語句衝突與 的REFERENCE約束 「FK_Employees_Departments」。該 衝突發生於數據庫 「Sync_Client」,表 「dbo.Employees」, 列 'DepartmentID的'。

沒有人有任何想法如何可以固定。我認爲同步框架無法以正確的順序執行更改。這個順序取決於幾個因素,如外鍵關係,命令的類型,例如插入,更新等。我真的被困在這裏。早期的幫助將不勝感激。

+0

你有沒有得到這個工作,因爲我也做的完全一樣,你是和具有與FK同樣的問題。期待你的回覆。 – Belliez 2010-04-09 15:24:33

+0

@Belliez,解決此問題的唯一方法是使用級聯刪除。這裏是另一個線程,我發佈在mdsn論壇 - http://social.microsoft.com/Forums/en-US/syncdevdiscussions/thread/0e8464a4-41a5-4897-b3d2-f14a0cf5d4b1 – 2010-04-12 04:11:00

回答

4

這是一個老問題了,但因爲沒有真正的答案:

同步需要列出的插入順序每個範圍表,使所有的外鍵的父母都在地方的任何外鍵的孩子之前插入。同步將在刪除時自動反轉該順序。

這是一切都很好,但如果你有一個數據庫,無論出於何種原因,你的父表或子表中的數據根據​​一些獨立的信息存儲在不同的服務器上,以便父母和孩子可能有不同的同步規則,你已經超越了可用的任何自動處理。

在這種情況下,如果正常的同步過濾器對您的基表的主鍵信息構建,你將需要強制過濾器使用的跟蹤表,而不是主鍵信息。現在在social.msdn.microsoft.com上有關於此的一些內容。

+0

+1「同步需要你列出插入順序中每個範圍中的表格「。在MS論壇上也看到你的帖子。太糟糕了,至今仍然沒有答案。 – Jake 2011-12-06 05:53:03