【发布时间】: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