好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

在C#中与Azure同步时如何不违反此主键?

项目总结

我们正在创建一个“数字”厨房,可以添加冰箱,冰柜等物品.然后,您可以在网络应用程序中查看这些物品,这样您就可以随时随地了解厨房中的杂货.

数据库

总共有三张桌子.

清单

它包含这些列表的ListID和名称,如“Fridge”或“Freezer”.所以,这基本上就是’容器’.

项目

然后有物品持有物品类型,即牛奶,1加仑.

listItems中

然后是ListItems(抱歉有点令人困惑的名字),它包含特定的项目.虽然Items只是可以添加的项目表,但ListItems是添加的项目.因此,添加到此表的行自然具有Lists表上的List和Items表上的Item的外键的外键.该表的主键是一个超级键,由几乎所有属性组成.

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

问题

这是一个例子.您想要添加两个单独的项目.第一个是3个火腿,每个200克,于5月28日到期.

接下来是另一个火腿,这个单一,但500克,并在5月31日到期:

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问题?

以下是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行略有不同,但属性相同.这可能是问题吗?

我不认为错误是你认为的错误.如果本地和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”的表 – 看起来像是我的商店过程参数 – 用两列主键定义.追踪它,你将解决问题.

查看更多关于在C#中与Azure同步时如何不违反此主键?的详细内容...

  阅读:43次