我已经阅读了这里的许多问题,这些问题乍一看似乎有类似的问题,但看起来并不完全相同。如果这个问题在某个地方得到了回答,我深表歉意,但就像我说的,我已经阅读了很多内容,但找不到答案。
我正在使用实体框架和 MVC 3。
我正在尝试向实体框架中的产品添加标签,这些产品具有多对多关系,并且有一个表仅使用链接表中的两个键将它们链接起来,因此 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>
When I SaveChanges()
我得到以下异常:
“违反主键约束'PK_Tags_1'。无法插入
对象“dbo.Tags”中存在重复键。\r\n该语句已
终止了。”
所以真正让我困惑的是:为什么它试图向 dbo.Tags 添加任何内容?在我看来,这应该简单地添加到 ProductTags 而不是标签。我在此方法的其他地方没有提及标签,因此绝不尝试将任何内容直接添加到标签表中。感觉我的 EF 中可能设置了错误,但我想不出是什么,它是从数据库生成的。
再次抱歉,如果这太明显了,我感觉很愚蠢。非常感谢任何帮助。
问题是你正在创建一个新的Tag
具有现有主键的对象。什么时候SaveChanges()
称为 EF 检测其已跟踪的实体和添加的新实体的变化。自从你的新Tag
EF 未跟踪对象,它尝试插入它。
您需要明确告诉 EF 创建的标签是现有标签。为此,您需要attach http://msdn.microsoft.com/en-us/library/dd487214.aspx it.
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);
}
此代码假设您没有多次附加单个标签,并且所有标签都是现有标签。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)