C# 财产';itemId';是对象的一部分';s键信息,无法修改
我有一个例外,说属性'itemId'是对象关键信息的一部分,不能修改。这是在我将原始sql查询更改为实体框架时发生的。下面是原始sql查询的代码,顺便说一下:C# 财产';itemId';是对象的一部分';s键信息,无法修改,c#,sql,database,entity-framework,linq,C#,Sql,Database,Entity Framework,Linq,我有一个例外,说属性'itemId'是对象关键信息的一部分,不能修改。这是在我将原始sql查询更改为实体框架时发生的。下面是原始sql查询的代码,顺便说一下: con1.Open(); cmd1.CommandText = "UPDATE [stringInstrumentItem] SET [itemId] = @newId WHERE itemId = @oldId"; cmd1.Connection = con1;
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中不能这样做。您希望更新密钥以保持顺序的原因是什么?这不应该有任何原因,但如果出于某种原因确实需要序列ID,可以将其放在另一列中
主键应该是任意的。它唯一的要求是它应该是唯一的。我想你可能采取了错误的方法 在EF中不能这样做。您希望更新密钥以保持顺序的原因是什么?这不应该有任何原因,但如果出于某种原因确实需要序列ID,可以将其放在另一列中
主键应该是任意的。它唯一的要求是它应该是唯一的。我想你可能采取了错误的方法 您不能修改主键。在您的情况下,您需要删除旧项并使用相同的数据创建新项。您不能在EF:@Anton-yes中修改主键的值,因为每当我删除一个项时,它都会在itemId中创建一个间隙,例如,我有id 42 43 44,然后我删除43,它将与此42 44类似。我所做的是,我希望它是这样的42 43。id按顺序排列。@mm8-这是否意味着我应该创建一个自动生成的id(即PK)和另一个可以修改的id?是否正确?请参阅代理项,您无法修改主键。在您的情况下,您需要删除旧项并使用相同的数据创建新项。您不能在EF:@Anton-yes中修改主键的值,因为每当我删除一个项时,它都会在itemId中创建一个间隙,例如,我有id 42 43 44,然后我删除43,它将与此42 44类似。我所做的是,我希望它是这样的42 43。id按顺序排列。@mm8-这是否意味着我应该创建一个自动生成的id(即PK)和另一个可以修改的id?是吗?看代理键是的,这就是目的。我决定为自动生成的id和修改的id创建一个单独的列(这将使其保持顺序)。是的,这就是目的。我决定为自动生成的id和修改的id创建一个单独的列(这将使其保持顺序)。