首页 文章

属性'name'是对象的关键信息的一部分,无法修改 . 实体框架

提问于
浏览
15

我正在尝试更新记录,我在 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 回答

  • 32

    查看yildizm85给这个问题的答案:entity framework not working on table without identity column

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

    查看您的 EAT_SourceNames 对象,看来没有主键字段,因此实体框架使用列'name'作为复合键的一部分,这意味着它是只读的 .

    解决方案是将主键字段添加到 EAT_SourceNames ,然后您的'name'字段将不再是主键的一部分 .

  • 2

    我今天也发生了同样的事 . 我用旧记录的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;
                    }
    
  • 7

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

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

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

    可能 nameEAT_SourceNames 实体的部分或完整主键 . 您无法修改对象's PK, is it EF'的限制(请参阅此thread) .

  • 3

    这是它的正确解决方案 .

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

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

    • 打开.edmx文件 .

    • 右键单击您的显示器并选择“映射详细信息” .

    • 单击模型浏览器,您将在屏幕右侧找到它 .

    • 现在,转到Entity Types文件夹,然后在您的案例EAT_SourceName中单击您的表 .

    • 现在您将找到EAT_SourceName的模型,现在右键单击名称并取消选中实体密钥 .

    • 现在清理并重建您的解决方案 .

  • 2

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

相关问题