属性“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的实体键。
您可以按照以下步骤执行此操作。
- 打开.edmx文件。
- 右键单击您的显示器并选择Mapping Details。
- 单击模型浏览器,您将在屏幕的右侧找到它。
- 现在,转到Entity Types文件夹,然后单击您的案例EAT_SourceName中的表。
- 现在您将找到EAT_SourceName的模型,现在右键单击名称并取消选中实体键。
- 现在清理并重建您的解决方案。
关键是你使用一个对象。 “name”属性标识对象,这就是您无法修改它的原因。 解决方案是使用SQL语句(UPDATE)修改表中的值并重新加载上下文。 真诚。