C# 如何在实体框架中更新主键值?

C# 如何在实体框架中更新主键值?,c#,entity-framework,C#,Entity Framework,我有表(以及实体数据模型中的实体)Person,其中包含以下字段: Name Type SocialID String FirstName String LastName String 哪个SocialID是主键。我想为每条记录更新SocialID的值。但是,当我尝试在Entity Framework中更新此字段时,出现以下错误: The property 'SocialID' is part of th

我有表(以及实体数据模型中的实体)
Person
,其中包含以下字段:

Name              Type
SocialID          String      
FirstName         String
LastName          String
哪个
SocialID
是主键。我想为每条记录更新
SocialID
的值。但是,当我尝试在Entity Framework中更新此字段时,出现以下错误:

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();
}

如何做到这一点???

根据我的知识主键一旦生成就不能通过编程进行更新,这违背了主键的用途。
如果使用新的主键再次插入所有数据并删除旧数据会更好。

为什么要更改主键?实体框架将使用该字段来标识对象,当它是主键时,不能更改其值


根据第一个答案,我建议您将table Person更改为有自己的主键,比如PersonID和mantain SocialID作为社交表的外键。如果您需要一个人拥有多个社交记录,您可能需要创建其他表,将PersonId对应于多个SociaID,从person表中删除SociaID。

如其他人所述,您无法在代码中完成此操作。您必须使用SQL进行更新。可以在迁移中进行,也可以直接在SQLServerManagementStudio中进行(如果您使用的是不同的数据库,也可以使用等效数据库)


如果您有其他表将此列用作外键(您必须先删除引用主键的所有表上的约束,然后修复数据并重新创建约束),则需要做的工作将远不止此。或者正如Moe在评论中所说,您可以设置外键在更新时级联。

Wow!我需要预览数据!因为社会的变化style@SeyedMortezaMousavi在这种情况下,您谈论的不是主键,而是外键。您应该向该表中添加一个新的键来标识此人。SociaID应该是社交样式表的主键。如果要更新表中所有记录的主键,请使用数据库脚本。实体框架不允许更改主键。@KirillBestemyanov根据他的评论,我认为他不想这样做。我担心SociaID是自然键(并且没有外键),并且此键的格式已更改。是的,我有另一个表引用此表。谢谢,但我需要在C#和实体框架中以编程方式更改它!您可以在更新时将外键更改为级联,这样应该会更容易。另一个选项是删除外键,先更新表A,然后更新表B,然后重新创建外键。主键实际上根本不应该更改(即使有时需要对它们进行一次性更改)。在代码中这样做意味着您不止一次地这样做,这可能是错误的,而且您正在更新的列不应该是关键。
UPDATE Person -- Or 'Persons' if that's what your table is called
SET SocialID = SocialID + '00'