【问题标题】:Primary key violation on adding of relationship from many to many linked tables in MVC 3 entity framework在 MVC 3 实体框架中从多对多链接表中添加关系的主键违规
【发布时间】:2011-11-19 00:51:02
【问题描述】:

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

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

产品:ProductID [int, primary key]、名称等

标签: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() 我得到以下异常:

“违反 PRIMARY KEY 约束 'PK_Tags_1'。无法插入 对象 'dbo.Tags' 中的重复键。\r\n语句已被 终止。”

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

再次抱歉,如果这很明显,我觉得很愚蠢。非常感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

    问题是您正在使用现有主键创建一个新的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);
    }
    

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

    【讨论】:

    • 天哪,谢谢你。我一直在玩 Attach,但完全误解了它的工作原理。这样就解决了。不幸的是,由于我是新注册的,所以我不能“投票给你”,但谢谢。你有一些好的因果报应。
    • 所以实际上我一直在为此苦苦挣扎,我无法让这种情况发挥作用:如果产品既存在于数据库中,又存在于产品中,我得到这个异常:“一个对象ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。"
    • 话说回来,我有点炸了,说不定早上就一切都清楚了。
    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多