我正在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);
我的同步应该在为用户分配特定操作时发生。
因此,如果我使用action x创建用户1,则会同步用户。如果我创建一个没有操作x的用户2,它将无法同步。到目前为止一切顺利。
如果现在我将操作x分配给用户2并重新应用同步,则用户2仍未同步。 我注意到的是在我的" ApplyChangeFailed"事件,我收到外键违规异常:
本地提供程序应用更改失败:INSERT语句与FOREIGN KEY约束冲突" FK_UserActions_Users"。冲突发生在数据库" LocalGenUM",table" dbo.Users",column' Id'。
我已经坚持了几个星期。有人可以帮忙吗?
答案 0 :(得分:0)
同步Fx并不关心FK。您在配置期间添加的约束仅与创建表时相同。在同步期间,它并不关心它。
按表同步Fx同步。当您添加用户2并跳过它同步时,当您修改操作x以分配给用户2时,它是已修改的操作行,而不是用户2.因此在同步期间,只有操作x将被检测为已更改并且它将成为同步的那个。 Sync Fx不会为您获取相关数据(同样,它并不关心这些关系)。
为什么不添加用户2同步?如果你不这样做,你必须在同步期间破解变更数据集(在APPLICATIONChanges或ChangesSelected事件中),以获取相关数据,如果它们不存在于目标表中。它只会让你进一步同步变得复杂。
答案 1 :(得分:0)
感谢JuneT的帮助。我们必须去寻找黑客,你有没有机会向我提供一个例子或提示如何应用它?我在你提到的事件上跟踪了DataSet,我可以看到为范围内的每个表添加了4列(sync_update_peer_timestamp,sync_update_peer_key,sync_create_peer_timestamp,sync_create_peer_key),键值为0,时间戳为4位整数(例如:2001)。
我尝试操作创建=更新的时间戳值,希望这会使系统将其视为新记录。但是,这导致DataSet中的错误。
PS:在数据集中,有更新用户的记录,并记录了他的操作,但似乎同步忽略了用户,并试图仅插入导致FK违规错误的操作(ApplyChangeFailed )