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