2017-07-14 36 views
1

我有一个异常,说属性'itemId'是对象的关键信息的一部分,无法修改。当我将原始的sql查询改为实体框架时发生了这种情况。下面是原始SQL查询的代码,这些代码的方式工作:属性'itemId'是对象的关键信息的一部分,不能修改

  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,而实体框架版本不能?我想知道实体框架版本有什么问题,以及如何解决这个问题?

+1

您不能修改主键。在你的情况下,你需要删除旧的并使用相同的数据创建新的 – Anton

+2

你不能修改EF中的主键的值:https://stackoverflow.com/questions/1367751/update-primary-key-value-使用实体框架 – mm8

+0

@Anton - 是的,因为每当我删除一个项目,它会在itemId中创建一个空白,例如我有ID 42 43 44,然后删除43,它会是这样的42 44.我是什么确实如此,我希望它能像这样42 43。这些id是按顺序排列的。 – RockStar

回答

0

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

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

+0

烨,这就是目的。我决定为自动生成的ID和修改的ID创建一个单独的列(这将使其保持顺序。 – RockStar

相关问题