加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 在MVC 3实体框架中添加多个到多个链接表的关系

发布时间:2020-12-15 18:58:32 所属栏目:asp.Net 来源:网络整理
导读:我已经阅读了这里的几十个问题,这些问题最初似乎有类似的问题,但似乎并不完全相同.如果在某个地方得到解答,我会发表大量道歉,但就像我说的那样,我已经阅读过负载而无法找到答案. 我正在使用Entity Framework和MVC 3. 我正在尝试在我的实体框架中为产品添加标
我已经阅读了这里的几十个问题,这些问题最初似乎有类似的问题,但似乎并不完全相同.如果在某个地方得到解答,我会发表大量道歉,但就像我说的那样,我已经阅读过负载而无法找到答案.

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

产品: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);
}

dbProduct是一个Product实体,Data是命名空间. productModel.Tags是List< string>

当我SaveChanges()时,我得到以下异常:

“Violation of PRIMARY KEY constraint ‘PK_Tags_1’. Cannot insert
duplicate key in object ‘dbo.Tags’.rnThe statement has been
terminated.”

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

对不起,如果这是非常明显的,我感觉非常愚蠢.任何帮助非常感谢.

解决方法

问题是您正在使用现有主键创建新的Tag对象.当调用SaveChanges()时,EF会检测已经跟踪的实体和添加的新实体的更改.由于EF未跟踪新的Tag对象,因此会尝试插入它.

您需要明确告诉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);
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读