属性“name”是对象的密钥信息的一部分,不能修改。实体框架

时间:2015-04-14 16:28:35

标签: c# entity-framework

我正在尝试更新记录,并在context.SaveChanges();

之后收到此错误消息
  

该物业的名称'是对象关键信息的一部分,不能修改。

以下是更新功能的代码:

 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 个答案:

答案 0 :(得分:33)

请参阅yildizm85对此问题的回答:entity framework not working on table without identity column

&#34;实体框架需要主键才能从数据库生成模型。如果表上没有主键,它只会选择不可为空的列作为连接的主键,并且实体将是只读的。&#34;

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

解决方案是将主键字段添加到EAT_SourceNames,然后添加您的姓名&#39;字段将不再是主键的一部分。

答案 1 :(得分:7)

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

答案 2 :(得分:3)

我认为更新文本主键的唯一方法是使用以下内容。

我认为最佳做法是使用&#34;功能性&#34;首要的关键。主键的目的只是唯一地标识一行。

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

这是正确的解决方法。

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

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

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

答案 5 :(得分:0)

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