“当IDENTITY_INSERT设置为OFF时,无法在表’电影’中为标识列插入显式值。”

我首先使用代码entity framework。 我一直在收到以下错误,无法弄清楚如何修复它:

“当IDENTITY_INSERT设置为OFF时,无法在表’电影’中为标识列插入显式值。”

我已经读过在我的迁移查询周围设置Sql(“SET IDENTITY_INSERT Movies ON”)和OFF应修复此问题,但是我没有在Movies表上运行任何查询。

电影表:

{ public class Movies { public byte Id { get; set; } [Display (Name = "Movie Name")] public string MovieName { get; set; } public Genre Genre { get; set; } [Required] public byte GenreId { get; set; } [Display (Name = "Release Date")] public DateTime ReleaseDate { get; set; } public DateTime DateAdded { get; set; } [Display (Name = "Numbers in Stock")] public int NumberInStock { get; set; } } } 

我的电影控制器:

 public ActionResult Save(Movies movies) { if (movies.Id == 0) { _context.Movies.Add(movies); } else { var moviesInDb = _context.Movies.Single(c => c.Id == movies.Id); moviesInDb.MovieName = movies.MovieName; moviesInDb.ReleaseDate = movies.ReleaseDate; moviesInDb.GenreId = movies.GenreId; moviesInDb.NumberInStock = movies.NumberInStock; } _context.SaveChanges(); return RedirectToAction("Index, Movies"); } 

我收到_context.SaveChanges()的错误;

我对我的Genre表有查询,如下所示

 public partial class PopulateGenreTable : DbMigration { public override void Up() { Sql("INSERT INTO Genres (Id, Name) VALUES (1, 'Action')"); Sql("INSERT INTO Genres (Id, Name) VALUES (2, 'Thriller')"); Sql("INSERT INTO Genres (Id, Name) VALUES (3, 'Family')"); Sql("INSERT INTO Genres (Id, Name) VALUES (4, 'Romance')"); Sql("INSERT INTO Genres (Id, Name) VALUES (5, 'Comedy')"); } public override void Down() { } } 

这是我播种dabase的唯一地方

我该如何解决? 请清楚解释,因为我是一个绝对的初学者。 谢谢

将记录插入Genres表时,可以通过不指定Id来轻松避免此错误。 因为看起来Id是一个IDENTITY COLUMN。 因此,在插入记录时不必指定值。 数据库将根据您定义的IDENTITY始终生成正确的Id值。 通常我们有INT类型和IDENTITY(1,1)的列。 这意味着将要插入的第一行将具有值为1的Id 。第二行的值为2,依此类推,依此类推。

有关详细信息,请查看此处 。

关于IDENTITY_INSERT...的错误消息,当我们想要将一个(或多个)显式值插入到具有IDENTITY的列时,可以使用命令SET IDENTITY_INSERT。 有关如何使用此命令的详细说明,请参见此处 。

您必须先打开它,然后插入然后将其关闭

 Sql("SET IDENTITY_INSERT Genres ON"); Sql("INSERT INTO Genres (Id, Name) VALUES (1, 'Action')"); Sql("INSERT INTO Genres (Id, Name) VALUES (2, 'Thriller')"); Sql("INSERT INTO Genres (Id, Name) VALUES (3, 'Family')"); Sql("INSERT INTO Genres (Id, Name) VALUES (4, 'Romance')"); Sql("INSERT INTO Genres (Id, Name) VALUES (5, 'Comedy')"); Sql("SET IDENTITY_INSERT Genres OFF"); 

但是,拥有一个标识列的意义在于我们不会选择标识所持有的值(在代理键上读取)。 在这种情况下,您只需从插入中删除ID列

 Sql("INSERT INTO Genres (Name) VALUES ('Action')"); Sql("INSERT INTO Genres (Name) VALUES ('Thriller')"); Sql("INSERT INTO Genres (Name) VALUES ('Family')"); Sql("INSERT INTO Genres (Name) VALUES ('Romance')"); Sql("INSERT INTO Genres (Name) VALUES ('Comedy')");