我正在尝试更新记录,我在 context.SaveChanges();
之后收到此错误消息
属性“name”是对象密钥信息的一部分,无法修改 .
以下是更新功能的代码:
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<EAT_Sources>();
}
public string name { get; set; }
public string version_id { get; set; }
public string allocation_name { get; set; }
我搜索了类似的问题,但找不到任何有效的解决方案 .
6 回答
查看yildizm85给这个问题的答案:entity framework not working on table without identity column
“实体框架需要主键从数据库生成模型 . 如果表上没有主键,它将只选择不可为空的列作为连接主键,实体将被读取/仅 . ”
查看您的
EAT_SourceNames
对象,看来没有主键字段,因此实体框架使用列'name'作为复合键的一部分,这意味着它是只读的 .解决方案是将主键字段添加到
EAT_SourceNames
,然后您的'name'字段将不再是主键的一部分 .我今天也发生了同样的事 . 我用旧记录的ID设置新实体的ID,错误消失了 .
我能想到更新文本主键的唯一方法是使用以下方法 .
我不认为使用“功能”主键是最佳做法 . 主键的目的只是唯一地标识一行 .
可能
name
是EAT_SourceNames
实体的部分或完整主键 . 您无法修改对象's PK, is it EF'的限制(请参阅此thread) .这是它的正确解决方案 .
您必须从EAT_SourceNames中取消选中Name的实体键 .
您可以按照以下步骤执行此操作 .
打开.edmx文件 .
右键单击您的显示器并选择“映射详细信息” .
单击模型浏览器,您将在屏幕右侧找到它 .
现在,转到Entity Types文件夹,然后在您的案例EAT_SourceName中单击您的表 .
现在您将找到EAT_SourceName的模型,现在右键单击名称并取消选中实体密钥 .
现在清理并重建您的解决方案 .
关键是你使用一个对象 . “name”属性标识对象,这就是您无法修改它的原因 . 解决方案是使用SQL语句(UPDATE)修改表中的值并重新加载上下文 . 真诚 .