属性“name”是对象的关键信息的一部分,无法修改。 entity framework

我正在尝试更新记录,并在context.SaveChanges();之后收到此错误消息context.SaveChanges();

属性“name”是对象的关键信息的一部分,无法修改。

以下是更新function的代码:

  if (context.EAT_SourceNames.Any(e => e.name == newSourceName)) { MessageBox.Show("Name already exists in the Database"); } else { var nameToUpdate = context.EAT_SourceNames.SingleOrDefault(e => e.name == sourceName.name); if (nameToUpdate != null) { nameToUpdate.name = newSourceName; context.SaveChanges(); RefreshDGVs(); } } 

我的SourceNames类如下所示:

  public EAT_SourceNames() { this.EAT_Sources = new ObservableListSource(); } public string name { get; set; } public string version_id { get; set; } public string allocation_name { get; set; } 

我搜索了类似的问题,但找不到任何有效的解决方案。

请参阅yildizm85对此问题的回答: entity framework不在没有标识列的表上工作

“entity framework需要主键从数据库生成模型。如果表上没有主键,它将只选择不可为空的列作为连接主键,实体将被读取/仅。”

查看您的EAT_SourceNames对象,看来没有主键字段,因此Entity Framework使用列’name’作为组合键的一部分,这意味着它是只读的。

解决方案是将主键字段添加到EAT_SourceNames ,然后您的“名称”字段将不再是主键的一部分。

我今天也发生了同样的事。 我用旧记录的ID设置新实体的ID,错误消失了。

 //This checks whether there's a record with same specific data. var kayitVarMi = _db.Sorgu.FirstOrDefault(a => a.Serial == sorgu.Serial); if (kayitVarMi != null) // If there's { sorgu.Id = kayitVarMi.Id; //This one does the trick _db.Entry(kayitVarMi).CurrentValues.SetValues(sorgu); } else // If not { _db.Sorgu.Add(sorgu); } // This whole block is in a transaction scope so I just check recordability. if (_db.SaveChanges() > 0) { _sorguKaydedildiMi = true; } 

我能想到更新文本主键的唯一方法是使用以下方法。

我不认为使用“function”主键是最佳做法。 主键的目的只是唯一地标识一行。

 context.Database.ExecuteSqlCommand("UPDATE Table SET [Name] = {0} WHERE [Name] = {1}", nameProperty, oldNameProperty); 

可能name是您的EAT_SourceNames实体的部分或完整主键。 您无法修改对象的PK,是EF的限制(请参阅此主题 )。

这是它的正确解决方案。

您必须从EAT_SourceNames中取消选中Name的实体键。

您可以按照以下步骤执行此操作。

  1. 打开.edmx文件。
  2. 右键单击您的显示器并选择Mapping Details。
  3. 单击模型浏览器,您将在屏幕的右侧找到它。
  4. 现在,转到Entity Types文件夹,然后单击您的案例EAT_SourceName中的表。
  5. 现在您将找到EAT_SourceName的模型,现在右键单击名称并取消选中实体键。
  6. 现在清理并重建您的解决方案。

关键是你使用一个对象。 “name”属性标识对象,这就是您无法修改它的原因。 解决方案是使用SQL语句(UPDATE)修改表中的值并重新加载上下文。 真诚。