如何更新实体框架中的主键值?

时间:2013-02-01 10:31:00

标签: c# entity-framework

我有表(以及实体数据模型中的实体)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();
}

我怎么能这样做?

3 个答案:

答案 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。