与Azure同步时如何不违反此主键?

时间:2015-05-20 10:33:59

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

项目摘要

我们正在创造一个数字化的'厨房,可以添加哪些物品放在冰箱,冰柜等中。然后就可以在网络应用程序中查看这些物品,这样您就可以随时了解厨房里的杂货。

数据库

总共有三张桌子。

解释

这包含这些列表的ListID和名称,例如' Fridge'或者'冷冻机'。所以,这基本上就是'容器'。

然后有项目,其中包含1种加仑牛奶的商品类型。

listItems中

然后有 ListItems (抱歉有点混淆的名字),其中包含特定的项目。虽然 Items 只是一个可以添加的项目表,但 ListItems 添加的项目。因此,添加到此表中的行自然具有列表表上的 List 和指向 Item 的外键的外键。 表。该表的主键是一个超级键,由几乎所有属性组成。

两个ListItem可以引用相同的 Item 和相同的 List ,只要它们具有不同的属性即可。它们可能在不同日期到期或不同的单位大小。唯一能使 Item 唯一的是名称,就像你添加了一个' Ham'一样,它永远不会覆盖' Milk'。添加另一个' Milk'然后会被视为相同的

问题

这是一个例子。您想要添加两个单独的项目。第一个是3个火腿,每个200克,于5月28日到期。 接下来是另一个火腿,这个单一,但500克,并在5月31日到期: enter image description here

ListID 1指的是名为Fridge的 List 。 ItemID 1指的是名为 Ham 的项目。

看到问题?外键是相同的。

它在我们的本地数据库中存储得很好,但在与Azure数据库同步时,我们收到以下错误:

{"Violation of PRIMARY KEY constraint 'PK__#A4D1762__44A4C03D49E5E4B8'. 
Cannot insert duplicate key in object 'dbo.@changeTable'. 
The duplicate key value is (1, 1).\r\n
The data for table-valued parameter \"@changeTable\" doesn't conform to the table type of the parameter. 
SQL Server error is: 3602, state: 30\r\nThe statement has been terminated."}

这是一个糟糕的数据库设计还是Azure问题?

更新1

以下是DDL在本地数据库中的显示方式:

CREATE TABLE [dbo].[ListItems] (
    [ListId] INT NOT NULL,
    [ItemId] INT NOT NULL,
    [Amount] INT NOT NULL, 
    [Volume] INT NOT NULL, 
    [Unit] NVARCHAR(MAX) NULL, 
    [ShelfLife] DATETIME NOT NULL, 
    CONSTRAINT [pk_ListItems] PRIMARY KEY CLUSTERED ([ShelfLife], [Volume], [Amount], [ItemId], [ListId]),
    CONSTRAINT [fk_ListItems] FOREIGN KEY ([ListId]) REFERENCES [dbo].[Lists] ([ListId]) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT [fk_ListItems2] FOREIGN KEY ([ItemId]) REFERENCES [dbo].[Items] ([ItemId]) ON DELETE CASCADE ON UPDATE CASCADE
);

Azure数据库DDL:

CREATE TABLE [dbo].[ListItems] (
    [ListId]    INT            NOT NULL,
    [ItemId]    INT            NOT NULL,
    [Amount]    INT            NOT NULL,
    [Volume]    INT            NOT NULL,
    [Unit]      NVARCHAR (MAX) NULL,
    [ShelfLife] DATETIME       NOT NULL,
    CONSTRAINT [PK_dbo.ListItems] PRIMARY KEY CLUSTERED ([ListId] ASC, [ItemId] ASC, [Amount] ASC, [Volume] ASC, [ShelfLife] ASC),
    CONSTRAINT [FK_dbo.ListItems_dbo.Items_ItemId] FOREIGN KEY ([ItemId]) REFERENCES [dbo].[Items] ([ItemId]) ON DELETE CASCADE,
    CONSTRAINT [FK_dbo.ListItems_dbo.Lists_ListId] FOREIGN KEY ([ListId]) REFERENCES [dbo].[Lists] ([ListId]) ON DELETE CASCADE
);

PK CONSTRAINT行略有不同,但属性相同。这可能是问题吗?

1 个答案:

答案 0 :(得分:1)

我不认为错误是您认为的错误。如果本地和Azure ListItems上的PK都命名相同的列(无论顺序如何),它们都是相同的。但是,错误消息提到了不同的PK定义(和不同的表名):

  

Violation of PRIMARY KEY constraint 'PK__#A4D1762__44A4C03D49E5E4B8'. Cannot insert duplicate key in object 'dbo.@changeTable'. The duplicate key value is (1, 1).

似乎有一个名为" @ changetable" - 看起来像我的商店过程参数 - 用两列主键定义。追踪它,你将解决问题。