【问题标题】:The property 'itemId' is part of the object's key information and cannot be modified属性“itemId”是对象的关键信息的一部分,不能修改
【发布时间】:2023-03-29 04:17:01
【问题描述】:

我遇到了一个异常,指出属性“itemId”是对象的关键信息的一部分,无法修改。这发生在我将原始 sql 查询更改为实体框架时。这是原始 sql 查询的代码,顺便说一下:

            con1.Open();
            cmd1.CommandText = "UPDATE [stringInstrumentItem] SET [itemId] = @newId WHERE itemId = @oldId";
            cmd1.Connection = con1;
            cmd1.Parameters.Add(new SqlParameter("@newId", id));
            cmd1.Parameters.Add(new SqlParameter("@oldId", plusId));
            a = cmd1.ExecuteNonQuery();
            con1.Close();
            cmd1.Parameters.Clear();

然后,我将该代码更改为实体框架:

using (var context = new MusicStoreDBEntities())
    {
        var bay = (from s in context.stringInstrumentItems where s.itemId == plusId select s).FirstOrDefault();
        bay.itemId = id;
        context.SaveChanges();
    }

它说我无法修改 itemId。为什么我可以使用原始 sql 查询版本修改 itemId 而实体框架版本不能?我想知道实体框架版本有什么问题以及如何解决这个问题?

【问题讨论】:

  • 不能修改主键。在您的情况下,您需要删除旧的并使用相同的数据创建新的
  • EF中不能修改主键的值:stackoverflow.com/questions/1367751/…
  • @Anton - 是的,因为每当我删除一个项目时,它都会在 itemId 中创建一个间隙,例如我有 id 42 43 44,然后我删除 43,它会像这样 42 44。我所做的是,我希望它像这样 42 43。id 是按顺序排列的。
  • @mm8 - 这是否意味着我应该创建一个自动生成的 id(即 PK)和另一个可以修改的 id?对吗?
  • 查看代理键here

标签: c# sql database entity-framework linq


【解决方案1】:

你不能在 EF 中这样做。您想要更新密钥以使它们保持顺序的原因是什么?应该没有任何理由,但如果您出于某种原因确实需要顺序 ID,您可以将其放在另一列中。

主键应该是任意的。唯一的要求是它应该是唯一的。我想你可能采取了错误的方法。

【讨论】:

  • 是的,这就是目的。我决定为自动生成的 id 和修改后的 id 创建一个单独的列(这将使其保持顺序。
猜你喜欢
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多