jue*_*n d 6 c# sql sql-server synchronization microsoft-sync-framework
我使用 MS Sync Framework 将我的 SQL Server 实例与本地 SQL CE 文件同步,使其能够与我的 Windows 应用程序脱机工作。
我使用 GUID 作为键。在我的桌子上,我在 2 列上有一个唯一索引:user_id
和setting_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_id
和setting_id
.
这应该可以工作并将数据合并在一起,因为这可能发生在现实生活中。但是在同步时出现错误,说唯一键约束导致错误。密钥对已存在于表中。
不能将重复值插入到唯一索引中。[ 表名 = user_settings, 约束名 = unique_userid_settingid ]
为什么 MS 同步不能处理?它不应尝试再次插入密钥对。如果需要,它应该更新值。
问题是,如果您将相同的密钥对添加到表的不同副本,它们将获得不同的 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。
由于插入的行现在在两个副本上应该是相同的,因此它应该可以很好地合并。
如果您必须将单个列作为表的唯一标识符,则可以使其有意义,例如,
CONCAT(user_ID, setting_id)
由于 User_ID 和 Settings_ID 是 FK,您应该已经生成了它们,因此连接它们应该很容易。