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

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

项目总结

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

数据库

一共有三个表。

列表

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

项目

然后是 Items,其中包含项目类型,即牛奶,1 加仑。

列表项

然后是 ListItems(抱歉,名称有点困惑),它包含特定 项目。 Items 只是一个可以添加的项目表,ListItems添加 的项目。因此,添加到该表的行自然具有指向 Lists 表上的 List 的外键和指向 Item 的外键项目表。该表的主键是一个 super 键,由其几乎所有属性构成。

两个 ListItem 可以引用相同的 Item 和相同的 List,只要它们具有不同的属性即可。它们可能会在不同的日期到期或具有不同的单位大小。唯一让 Item 独一无二的是名称,就像如果您添加了“火腿”,它永远不会覆盖“牛奶”。添加另一个“牛奶”将被视为相同的项目

问题

这是一个例子。您想要添加两个单独的项目。第一个是 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线略有不同,但属性是一样的。这可能是问题所在吗?

最佳答案

我不认为错误出在你认为的地方。如果本地和 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 同步时如何不违反此主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30347106/

相关文章:

java - sql server 数据插入错误

c# - Azure 图形 API 不适用于上一页请求 (&previous-page=true)

c# - 无法对 Pen 进行更改,因为权限无效

python - 如何使用 Python 列表中的值查询 SQLite 数据库?

sql - 拥有条款面临的问题

使用 GROUP 或 RANK 中的 WHERE 的 SQL 语句

SQL Server - 有条件地增加计数器

java - 如何将JSON数据插入到sql server而不转换为Java bean

c# - Automapper 异常 : "Missing type map configuration or unsupported mapping."

c# - 在 Session_OnEnd 中获取用户