Сохранение нескольких изменений в базе данных - PullRequest
1 голос
/ 27 апреля 2019

Я использую .Net Core MVC и по какой-то причине, когда я пытаюсь использовать цикл для одновременного сохранения группы файлов в БД, я получаю эту ошибку:

SqlException: Невозможно вставитьявное значение для столбца идентификаторов в таблице 'Movie', когда для 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 Ответ

4 голосов
/ 27 апреля 2019

Краткий ответ: Вы должны переместить определение 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...