加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:14:31 所属栏目:百科 来源:网络整理
导读:项目总结 我们正在创建一个“数字”厨房,可以添加冰箱,冰柜等物品.然后,您可以在网络应用程序中查看这些物品,这样您就可以随时随地了解厨房中的杂货. 数据库 总共有三张桌子. 清单 它包含这些列表的ListID和名称,如“Fridge”或“Freezer”.所以,这基本上就
项目总结

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

数据库

总共有三张桌子.

清单

它包含这些列表的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).rn
The data for table-valued parameter "@changeTable" doesn't conform to the table type of the parameter. 
SQL Server error is: 3602,state: 30rnThe 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行略有不同,但属性相同.这可能是问题吗?

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读