gpt4 book ai didi

asp.net-mvc-3 - 在 MVC 3 Entity Framework 中添加从多到多链接表的关系的主键冲突

转载 作者:行者123 更新时间:2023-12-04 13:34:14 24 4
gpt4 key购买 nike

我已经阅读了这里的许多问题,这些问题起初似乎有类似的问题,但似乎并不完全相同。如果有人在某处回答了这个问题,我深表歉意,但就像我说的那样,我已经阅读了大量内容却找不到答案。

我正在使用 Entity Framework 和 MVC 3。
我正在尝试将标签添加到我的 Entity Framework 中的产品,这些标签具有多对多关系和一个表,将它们与链接表中的两个键链接起来,因此 EF 将标签压缩为 Product 的一个属性。表格设置如下:

产品:ProductID [int,主键]、名称等。

标签:TagName [字符串,主键]

产品标签:产品 ID、标签名称

所以要访问 ProductTags 我可以使用 product.Tags

这是我的代码:

dbProduct.Tags.Clear();
foreach (var tag in productModel.Tags)
{
Data.Tag dbTag = new Data.Tag();
dbTag.TagName = tag;
dbProduct.Tags.Add(dbTag);
}

dbProduct 是 Product 实体,Data 是命名空间。 productModel.Tags 是 List<string>
当我 SaveChanges()我收到以下异常:

"Violation of PRIMARY KEY constraint 'PK_Tags_1'. Cannot insert duplicate key in object 'dbo.Tags'.\r\nThe statement has been terminated."



那么真正让我感到困惑的是:它为什么要向 dbo.Tags 添加任何内容?在我看来,这应该简单地添加到 ProductTags 而不是标签。我没有在此方法的其他地方提及标签,因此在任何时候都不要尝试将任何内容直接添加到标签表中。感觉我的 EF 中可能有一些设置错误,但我想不出是什么,它是从数据库生成的。

再次抱歉,如果这太明显了,我感觉很愚蠢。非常感谢任何帮助。

最佳答案

问题是您正在创建一个新的 Tag具有现有主键的对象。当SaveChanges()称为 EF 检测其已经跟踪的实体和添加的新实体的变化。自从您的新 Tag对象未被 EF 跟踪,它尝试插入它。

您需要明确告诉 EF 创建的标签是现有标签。为此,您需要attach它。

dbProduct.Tags.Clear();
foreach (var tag in productModel.Tags)
{
Data.Tag dbTag = new Data.Tag();
dbTag.TagName = tag;

db.TagSet.Attach(dbTag);

dbProduct.Tags.Add(dbTag);
}

此代码假定您没有多次附加单个标签,并且所有标签都是现有标签。

关于asp.net-mvc-3 - 在 MVC 3 Entity Framework 中添加从多到多链接表的关系的主键冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8190985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com