【问题标题】:Microsoft Sync Framework unique index errorMicrosoft Sync Framework 唯一索引错误
【发布时间】:2021-01-31 16:51:45
【问题描述】:

我使用 MS Sync Framework 将我的 SQL Server 实例与本地 SQL CE 文件同步,以使其能够与我的 Windows 应用脱机工作。

我使用 GUID 作为键。在我的桌子上,我在 2 列上有一个 唯一索引user_idsetting_id

usersettings table
------------------
id          PK  -> I also tried it without this column. Same result
user_id     FK  
setting_id  FK
value

现在我执行以下操作:

我在这两个数据库的表中创建了一条新记录 - SQL Server 和 SQL CE,具有相同的 user_idsetting_id

这应该可以工作并将数据合并在一起,因为这可能在现实生活中发生。但是当我同步说唯一键约束导致错误时出现错误。密钥对已存在于表中。

不能将重复值插入唯一索引。 [表名=user_settings,约束名=unique_userid_settingid]

为什么 MS 同步不能处理这个问题?它不应该再次尝试插入密钥对。如果需要,它应该更新值。

【问题讨论】:

  • 这真的与 ISO/ANSI 语言有关吗?
  • 既然是关于 SQL 中的唯一键,我会说是的。
  • 外键不保证唯一性。
  • 同步过程中是否出现错误,那么它应该显示为冲突,您必须在代码中解决。
  • 我在手册中也看到了这一点:默认情况下,以下对象不会复制到客户端数据库:FOREIGN KEY 约束、UNIQUE 约束、DEFAULT 约束和 SQL Server ROWGUIDCOL 属性。这表明对您的方案的支持不佳

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


【解决方案1】:

问题是,如果您将相同的密钥对添加到表的不同副本中,它们会在此 usersettings 表中获得不同的 ID (GUID) 作为主键。

由于这只是用户和设置之间的多对多表,因此不需要将该 ID 作为 PK(甚至根本不需要列)。

相反,只需使用两个 FK 的连接键,例如,

CREATE TABLE [dbo].[usersettings](
    [user_id] [UNIQUEIDENTIFIER] NOT NULL,
    [setting_id] [UNIQUEIDENTIFIER] NOT NULL,
    [value] [varchar](50) NOT NULL,
    CONSTRAINT [PK_usersettings] PRIMARY KEY CLUSTERED ([user_id] ASC, [setting_id] ASC) );

当然,包括适当的字段设置(例如,如果您使用 VARCHAR 来存储 ID)和相关的 FK。

由于现在插入的行在两个副本上应该相同,因此应该可以很好地合并。

如果你必须有一个列作为表的唯一标识符,你可以让它有意义,例如,

  • PK (ID) 变为 varchar (72)
  • 它充满了CONCAT(user_ID, setting_id)

由于 User_ID 和 Setting_ID 是 FK,您应该已经生成了它们,因此连接它们应该很容易。

【讨论】:

  • 很遗憾这行不通。一开始我没有id 专栏。我的桌子和你描述的一样。
  • 我添加了一种方法,当您必须有 1 个 ID 列时...将其更改为 VARCHAR(72) 并使用 CONCAT(user_ID, setting_Id) 填充它
  • 这可能会解决问题。但由于我有一个庞大的数据库,我只会在我知道它确实有必要并且没有更好的方法时才会改变它。我希望有一个消息来源是人们正在处理这个问题。这应该是同步框架的一个常见问题。
  • 我尊重这是一个明确的问题(并且在您的情况下也可能会同意 - 我肯定想探索其他选择)。但是,我将把它留在这里,如果没有其他原因,只是为了阻止其他人给你这个答案。
  • 当然。如果我没有更好的解决方案,我会完全按照你的建议去做。
【解决方案2】:

您是否在同步期间收到错误,那么它应该显示为冲突,您必须在代码中解决。

https://docs.microsoft.com/en-us/previous-versions/sql/synchronization/sync-framework-2.0/bb734542(v=sql.105)

我在手册中也看到了这一点:默认情况下,以下对象不会复制到客户端数据库:FOREIGN KEY 约束、UNIQUE 约束、DEFAULT 约束和 SQL Server ROWGUIDCOL 属性。这表明对您的方案的支持不佳

我建议你从设备表中删除唯一约束。

【讨论】:

  • 是的,我在同步过程中遇到错误。但我无法正确解决它。所有解决操作都没有真正帮助我,因为我不只是遇到同步冲突 - 我遇到了数据库错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多