将多个更改保存到数据库

时间:2019-04-27 13:12:21

标签: c# asp.net-core

我正在使用.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; }
}

1 个答案:

答案 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();
}