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

标签 asp.net-mvc-3 entity-framework many-to-many

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

我正在使用 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/

相关文章:

asp.net-mvc-3 - 在 MVC 3 中持久化用户数据

c# - 具有多个 GroupBy 要求的多重联接的 LINQ 扩展方法

entity-framework - EF4 "Code Only"准备好用于生产了吗?

python - Django 发出多对多变化的信号

nhibernate - 删除多对多关系会导致删除和插入查询

asp.net-mvc - MVC3 远程验证和 AntiForgeryToken

asp.net - 无法使用 JQGrid 添加行

asp.net-mvc-3 - Ajax 请求后手动绑定(bind) JQuery 验证

c# - 尝试使用 LINQ 以数据库字段作为参数获取不同的值

node.js - Sequelize 多对多关联 : getter/setter methods do not exist