【问题标题】:microsoft sync framework Foreign key violation微软同步框架外键违规
【发布时间】:2014-12-09 11:37:17
【问题描述】:

我正在我的 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 仍未同步。 我注意到的是,在我的“ApplyChangeFailed”事件中,我得到了一个外键违规异常:

本地提供程序应用更改失败:INSERT 语句与 FOREIGN KEY 约束“FK_UserActions_Users”冲突。冲突发生在数据库“LocalGenUM”、表“dbo.Users”、列“Id”中。

我已经坚持了好几个星期了。有人可以帮忙吗?

【问题讨论】:

    标签: c# sql-server microsoft-sync-framework


    【解决方案1】:

    Sync Fx 不关心 FK。您在配置过程中添加的约束仅限于创建表时。在同步期间,它不关心它。

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

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

    【讨论】:

    • 您是说只有动作 x 会被检测为已更改,因为那是已修改的行,而不是用户 2。但即使我尝试对两者进行更改,同步也不起作用。什么将一行标记为已更改?
    【解决方案2】:

    感谢JuneT 的帮助。我们必须进行黑客攻击,您是否有机会为我提供有关如何应用它的示例或提示?我跟踪了您提到的事件的数据集,我可以看到为范围内的每个表添加了 4 列(sync_update_peer_timestamp、sync_update_peer_key、sync_create_peer_timestamp、sync_create_peer_key),键的值为 0,时间戳为 4 位整数(例如:2001)。

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多