2014-12-09 150 views
0

我在我的C#windows應用程序中實現同步框架。微軟同步框架外鍵違規

我所擁有的是一個表用戶,一個表操作和一個表userActions,它們在這兩個表上都有一個外鍵。

當我在定義我的供應範圍,順序是父母則孩子:當一個用戶分配一個特定的動作

DbSyncScopeDescription scopeDesc = ..... 

DbSyncTableDescription users = 
       SqlSyncDescriptionBuilder.GetDescriptionForTable("Users", new SqlConnection(ServerConnection)); 

DbSyncTableDescription userActions = 
       SqlSyncDescriptionBuilder.GetDescriptionForTable("UserActions", new SqlConnection(ServerConnection)); 

userActions.Constraints.Add(new DbSyncForeignKeyConstraint("FK_UserActions_Users")); 
userActions.Constraints.Add(new DbSyncForeignKeyConstraint("FK_UserActions_Actions")); 

scopeDesc.Tables.Add(users); 
scopeDesc.Tables.Add(userActions); 

我同步應該發生。

所以,如果我創建一個用戶1與行動x,用戶同步。如果我創建了一個沒有操作x的用戶2,它將不會同步。到現在爲止還挺好。

如果現在我將操作x分配給用戶2並重新應用同步,則用戶2仍未同步。 我注意到的是,在我的「ApplyChangeFailed」事件中,我得到一個外鍵衝突異常:

本地供應商申請更改失敗:INSERT語句衝突與外鍵約束「FK_UserActions_Users」。衝突發生在數據庫「LocalGenUM」,表「dbo.Users」,列'Id'中。

我一直堅持這個星期。誰能幫忙?

回答

0

同步Fx不關心FK。您在配置期間添加的約束條件與創建表時相同。在同步過程中,它並不關心它。

同步Fx按表格同步。當您添加用戶2並跳過同步時,當您修改操作x以分配給用戶2時,它是已修改的操作行,而不是用戶2.因此,在同步期間,只有操作x會被檢測爲已更改,並且它是那個將會同步。同步Fx不會爲你獲取相關數據(再次,它不關心這些關係)。

爲什麼不讓用戶2在添加時同步?如果您不這樣做,則必須在同步過程中對更改數據集(在ApplyingChanges或ChangesSelected事件中)進行破解,以獲取相關數據(如果它們不存在於目標表中)。這會讓你進一步同步變得複雜。

+0

你說只有動作x會被檢測到更改,因爲這是已修改的行,而不是用戶2.但即使我嘗試對兩者進行更改,同步也不起作用。什麼標誌一行改變? – Nidal 2014-12-09 15:46:50

0

感謝JuneT的幫助。我們必須爲黑客行事,你有沒有可能向我提供一個例子或暗示如何應用它?我跟蹤了你提到的事件上的DataSet,我可以看到爲範圍中的每個表添加了4列(sync_update_peer_timestamp,sync_update_peer_key,sync_create_peer_timestamp,sync_create_peer_key),鍵值爲0,時間戳爲4位整數(例如:2001)。

我試着操縱時間戳值使得create = update,希望這可以使系統認爲它是一個新記錄。但是,這導致了DataSet中的錯誤。

PS:在數據集中,更新的用戶有記錄,並記錄他的動作,但似乎同步忽略了用戶,並試圖插入僅導致FK違規錯誤的動作( ApplyChangeFailed)