2014-12-09 89 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)