Sme*_*ats 6 many-to-many entity-framework asp.net-mvc-3
我已经阅读了这里的几十个问题,这些问题最初似乎有类似的问题,但似乎并不完全相同.如果在某个地方得到解答,我会发表大量道歉,但就像我说的那样,我已经阅读过负载而无法找到答案.
我正在使用实体框架和MVC 3.我正在尝试在我的实体框架中为产品添加标签,这些标签具有多对多的关系,并且只是链接表中的两个键将它们链接起来,因此EF压缩了标签到产品的属性.表格设置如下:
产品:ProductID [int,主键],名称等
标签:TagName [字符串,主键]
ProductTags:ProductID,TagName
因此,要访问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);
}
Run Code Online (Sandbox Code Playgroud)
dbProduct是一个Product实体,Data是命名空间.productModel.Tags是一个List<string>
当我SaveChanges()得到以下异常时:
"违反PRIMARY KEY约束'PK_Tags_1'.无法在对象'dbo.Tags'中插入重复键.\ r \n该语句已被终止."
所以我真正得到的是:为什么要尝试在dbo.Tags中添加任何内容?在我看来,这应该只是添加到ProductTags而不是标签.我没有在此方法的其他地方提及标签,因此在任何时候都不要尝试直接在Tags表中添加任何内容.感觉我的EF中可能有一些设置错误,但我无法想象它是从数据库生成的.
对不起,如果这是非常明显的,我感觉非常愚蠢.任何帮助非常感谢.
Era*_*nga 13
问题是您正在Tag使用现有主键创建新对象.当SaveChanges()调用EF时,它会检测已经跟踪的实体的更改以及添加的新实体.由于TagEF未跟踪新对象,因此会尝试插入它.
您需要明确告诉EF创建的标记是现有标记.要做到这一点,你需要附加它.
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);
}
Run Code Online (Sandbox Code Playgroud)
此代码假定您没有多次附加单个标记,并且所有标记都是现有标记.
| 归档时间: |
|
| 查看次数: |
3899 次 |
| 最近记录: |