使用实体框架更新主键值

问题描述 投票:50回答:5

我正在尝试从实体框架中更新复合主键的一个值,并且收到此错误:“属性'CustomerID'是对象键信息的一部分,无法修改。”

这是我的代码:

Dim customer As Customer = (From c In db.Customer Where c.CustomerID = "xxx" AndAlso c.SiteKey = siteKey).FirstOrDefault
customer.CustomerID = "fasdfasdf"
db.SaveChanges()

似乎太简单了。您无法在实体框架内更新主键,这是真的吗?我找不到有关该主题的任何文档。谢谢!

.net sql-server vb.net entity-framework
5个回答
11
投票

您不能并且有充分的理由。请参阅KM评论。


58
投票

我有博士学位。在cs中-在数据库方面,因此此答案与程序员的观点有所不同。就奥利弗·哈纳皮(Oliver Hanappi)而言,如果它不是替代钥匙,它有时可能会更改。例如。自然键或复合键。例如。有可能在美国更改您的SSN。但是多年以来,许多程序员会认为这是一个不可更改的密钥,因此会使用它。更改由外键组成的复合主键更为常见。


21
投票

您无法通过实体框架更新主键,因为实体框架不知道要更新哪个数据库行。


0
投票

如果在任何时候都可能只有一个数据库上下文实例,那么修改pk不会是这样的问题。但是每个上下文实例都维护自己的缓存,并且可以缓存要修改的记录。


-3
投票

您无法更新主键,但这不是实体框架的限制,而是数据库开发的非常基本的规则。主键一次分配给表中的一行,并使该行唯一。也许您可以通过某些方式来更新密钥,但这肯定违反了主密钥的定义。

© www.soinside.com 2019 - 2024. All rights reserved.