微软同步框架外键冲突



我正在我的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);

我的同步应该在为用户分配特定操作时发生。

因此,如果我使用操作 x 创建一个用户 1,则该用户将同步。如果我在没有操作 x 的情况下创建用户 2,它将不会同步。目前为止,一切都好。

如果现在我将操作 x 分配给用户 2 并重新应用同步,则用户 2 仍未同步。我注意到的是,在我的"应用更改失败"事件中,我收到外键冲突异常:

本地提供程序应用更改失败:INSERT 语句与外键约束"FK_UserActions_Users"冲突。冲突发生在数据库"LocalGenUM"中,表"dbo。用户",列"Id"。

我已经坚持了几个星期了。谁能帮忙?

同步 Fx 不关心 FK。 预配期间添加的约束仅限于创建表时。在同步期间,它不关心它。

同步 Fx 按表同步。当您添加用户 2 并跳过同步时,当您修改操作 x 以分配给用户 2 时,修改的是操作行,而不是用户 2。因此,在同步期间,只有操作 X 会被检测为已更改,并且是将要同步的操作 X。Sync Fx不会为你抓取相关数据(同样,它不关心这些关系(。

为什么不让用户 2 在添加时同步? 如果不这样做,则必须在同步期间破解更改数据集(在"应用更改"或"更改选定"事件中(,以获取相关数据(如果目标表中不存在相关数据(。它只会使您进一步同步复杂化。

感谢您的帮助 JuneT。我们必须去黑客,你有没有机会给我一个如何应用它的例子或提示?我跟踪了您提到的事件的 DataSet,我可以看到为范围(sync_update_peer_timestamp、sync_update_peer_key、sync_create_peer_timestamp、sync_create_peer_key(中的每个表添加了 4 列,键的值为 0,时间戳是 4 位整数(例如:2001(。

我尝试操纵时间戳值,使创建=更新,希望这使系统将其视为新记录。但是,这会导致数据集中出现错误。

PS:在数据集中,有更新用户的记录,以及他的操作的记录,但似乎同步忽略了用户,并尝试仅插入导致 FK 违规错误的操作(应用更改失败(

最新更新