我有表(以及实体数据模型中的实体)Person
,其中包含以下字段:
Name Type
SocialID String
FirstName String
LastName String
SocialID
是主键。我想为每条记录更新SocialID
的值。但是,当我尝试在实体框架中更新此字段时,我收到以下错误:
The property 'SocialID' is part of the object's key information and cannot
be modified.
我得到的错误代码是:
foreach (var p in Entity.Persons)
{
p.SocialID= p.SocialID + "00";
Entity.SaveChanges();
}
我怎么能这样做?
答案 0 :(得分:4)
正如其他人所说,你不能在代码中这样做。您必须在SQL中进行更新。在迁移中或直接在SQL Server Management Studio中(或者如果您使用的是其他数据库,则等效)。
UPDATE Person -- Or 'Persons' if that's what your table is called
SET SocialID = SocialID + '00'
如果你有其他表使用这个列作为外键,那么它将需要更多的工作(你必须首先删除约束 - 在所有引用你的主键的表上 - 然后修复数据并重新创建约束)。或者正如Moe在评论中所说,您可以将外键设置为在更新时级联。
答案 1 :(得分:2)
据我所知,一旦生成的主键不能以编程方式更新,这就违背了主键的用途。 如果您使用新的主键再次插入所有数据并删除旧数据,那将会更好。
答案 2 :(得分:-1)
为什么要更改主键?实体框架将使用该字段来标识对象,当它是主键时,您无法更改其值。
根据第一个答案,我建议您将表Person更改为拥有自己的主键,让我们说PersonID并将SocialID作为Social表的外键。如果您需要一个人拥有多个社交记录,您可能需要创建其他表以将PersonId与几个SocialId对应,从person表中删除SocialId。