Microsoft Sync Framework 唯一索引错误

jue*_*n d 6 c# sql sql-server synchronization microsoft-sync-framework

我使用 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
Run Code Online (Sandbox Code Playgroud)

现在我执行以下操作:

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

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

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

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

sea*_*anb 2

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

由于这只是用户和设置之间的多对多表,因此不需要将该 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) );
Run Code Online (Sandbox Code Playgroud)

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

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

如果您必须将单个列作为表的唯一标识符,则可以使其有意义,例如,

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

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