我有3个表:Content
,Language
和Content_Language
。
Content_Language
有两个外键,一个用于Content
,另一个用于Language
。
在代码中,我通过以下方式删除Content_Language中的一个关联:
content.Content_Language.Remove(cl);
然后添加另一个(不同的语言,相同的内容记录);
content.Content_Language.Add(new Content_Language() { LanguageId = 6 };
当我致电SaveChanges
时,我得到:
“Content_Language”类型的实体实例上的关键成员“ContentId”的值已更改。无法更改实体密钥成员。
我可以告诉他,我正在移除一个项目并添加另一个项目。为什么这是一个问题?
答案 0 :(得分:1)
Content_Language
有一个由LanguageId
和ContentId
组成的复合主键。当你实例化这样的一个:
new Content_Language() { LanguageId = 6 }
,然后创建一个ContentId
为零的实例。
然后,您将其添加到Content_Language
导航集合中,当EF执行修复时,它会尝试将ContentId
更改为content.Id
的值。但EF不允许您更改主键。因此你的错误。
您应该能够这样做:
var cl = new Content_Language() { LanguageId = 6, ContentId = content.ID }
您也不需要将其添加到content.Content_Language
集合,因为EF修复会为您执行此操作