我正在使用.Net Core MVC
,由于某种原因,当我尝试使用循环一次将一堆文件保存到数据库时,出现此错误:
SqlException:无法为身份列插入显式值 IDENTITY_INSERT设置为OFF时,表“电影”。
从搜索看来,这通常是在您尝试手动设置ID时生成的,但这不是我正在做的事情。这是我的代码:
foreach (var item in files)
{
string path = item.ToString();
string title = path.Replace(remove[0] + remove[1], "");
movie.IMDBId = 0123;
movie.Title = title;
movie.FilePath = path;
movie.Year = "2007";
_context.Add(movie);
_context.SaveChanges();
}
由于某种原因,这会将第一项保存在目录中,然后出现错误。我已经搜索了几个小时,但仍未找到解决该问题的方法,因此对您的任何帮助将不胜感激。
编辑-电影模型
public class Movie
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("LibraryID")]
public virtual Library Library { get; set; }
public int IMDBId { get; set; }
public string Title { get; set; }
public string Year { get; set; }
public string Genre { get; set; }
public string Description { get; set; }
public string PosterPath { get; set; }
public string FilePath { get; set; }
}
答案 0 :(得分:4)
简短答案:您应将movie
变量定义移至本地for循环作用域。
详细答案:
由于变量movie
是在循环外的某个位置定义的,因此每个文件都可以重用它。第一次运行
_context.Add(movie);
_context.SaveChanges();
您在数据库中创建对象,并且Entity Framework更新对象movie
,并设置主键和所有其他字段。第二次运行此代码时,EF尝试再次使用相同的主键插入对象,因此会出现错误。
示例解决方案:
foreach (var item in files)
{
string path = item.ToString();
string title = path.Replace(remove[0] + remove[1], "");
var newMovie = new Movie
{
IMDBId = 0123,
Title = title,
FilePath = path,
Year = "2007"
};
_context.Add(newMovie);
_context.SaveChanges();
}