0

我有这个简单的代码:(更新值)

我正在尝试更新列“c”

 using (MaxEntities ctx = new MaxEntities())
            {
                aa orders = (from order in ctx.aa
                             select order).First();
                orders.c = 22;
                ctx.SaveChanges();
            }

这是表格:

CREATE TABLE [dbo].[aa](
    [a] [int] NULL,
    [b] [int] NOT NULL,
    [c] [int] NOT NULL
) ON [PRIMARY]

和里面的值: 在此处输入图像描述

但我得到一个例外:

属性“c”是对象的关键信息的一部分,不能修改。

在此处输入图像描述

我是 EF 的新手。

任何帮助都感激不尽。

4

4 回答 4

6
The property 'c' is part of the object's key information and cannot be modified.

这就是为什么你不能编辑它。也许您需要将id列添加为指定身份的键

于 2012-06-16T08:40:34.280 回答
2

如另一个答案中所述,EF 必须唯一标识每个实体。如果数据库中没有 PK,EF 会推断出一些密钥。键被认为是固定的,因此如果 EF 被推断c为键的一部分(并且这样做是因为它使用所有不可为空的非二进制列),则您无法更改其值。此外,EF 将所有没有主键的表都视为只读,因此即使您c从设计器中的键中删除并修改c值,您在执行时也会遇到另一个异常SaveChanges

第二个例外的原因在于 EF 描述模型和数据库的方式。当 EF 推断密钥时,它只是为了描述您的实体和上下文的内部需求而不是为了描述数据库。当 EF 尝试保存更改时,它会根据数据库描述构建 UPDATE 语句并且没有关于真实数据库 PK 列的信息,它将无法识别正确的更新记录(EF 中的每个更新都只能影响单个记录 - EF 检查ROWCOUNT)。这可以通过欺骗 EF 并更新其数据库描述 = 通过将表描述中的某些列描述为主键来解决。这会导致多个问题:

  • 您必须在数据库中有一些唯一的列,否则此方法将不起作用。
  • 您必须手动编辑 EDMX(作为 XML)以添加此更改
  • 您不能使用默认 MS EDMX 设计器从数据库更新您的模型,因为它会删除您的更改

简单的建议:要么使用带有主键的数据库表,要么不要使用实体框架。

于 2012-06-16T15:24:06.757 回答
1

这里缺少主键。在表中添加主键就可以了。

于 2012-06-16T08:45:44.310 回答
1

我相信如果根本没有 PK,EF 会使用所有字段/列作为关键信息的一部分。这是一个很好的解释: @SteveWilkes 为什么。但是您的实体是什么样的?另一种可能性是它没有属性,因为关联在不同的实体内,如果这是一个外键。

编辑

这让我开始思考。在某些情况下,您必须使用没有 PK 的遗留表,即使您永远不会创建这样的东西。观点呢?EF 是一个映射器 - 它必须唯一标识该记录,以便推断和定义该键。是的,您可以使用存储过程,但您也可以破解XML并从表定义中删除键吗?

并再次编辑 发布此内容后,我看到@Ladislav Mrnka 已经说过类似的想法(欺骗 EF 并更新其数据库描述),所以它已经完成(警告:自担风险消费 - 从未尝试过)。快速谷歌给我这个博客有明确的说明:

Close the model designer in Visual Studio if it is still open and re-open the .edmx file in an XML editor
Find the edmx:StorageModels -> Schema -> Entity Container -> EntitySet element that refers to the      table in question
On the EntitySet element, rename the store:Schema attribute to Schema
Remove the store:Name attribute altogether
Remove the opening and closing DefiningQuery tags and everything in between them
Save and close the .edmx file

但说真的,谁不喜欢PK呢?不能加个id吗?

于 2012-06-16T13:59:07.277 回答