2016-07-21 2 views
1

У меня есть добавление и редактирование действий в моем MovieController, которые оба идут в представление MovieForm. В целях MovieForm, у меня есть следующие:Entity Framework/ASP.NET MVC 5 DateTime Exception

@Html.TextBoxFor(m => m.Movie.ReleaseDate, "{0:MMM dd yyyy}", new { @class = "form-control" }) 

Также см мой соответствующую модель Movie:

public class Movie 
    { 
     public int Id { get; set; } 
     [Required] 
     [StringLength(255)] 
     public string Name { get; set; } 

     public Genre Genre { get; set; } 
     [Required] 
     [Display(Name = "Genre")] 
     public byte GenreId { get; set; } 
     [Display(Name ="Release Date")] 
     public DateTime ReleaseDate { get; set; } 
     public DateTime DateAdded { get; set; } 
     [Display(Name = "Number in Stock")] 
     public int NumberInStock { get; set; } 

    } 

И ViewModel:

public class MovieFormViewModel 
    { 
     public IEnumerable<Genre> Genres { get; set; } 
     public Movie Movie { get; set; } 
     public bool IsNew { get; set; } 
    } 
} 

Так как вы можете видеть, там Безразлично» t, похоже, что-то не так с свойством ReleaseDate. В базе данных (localDB) он имеет тип «datetime».

Однако, странно, что всякий раз, когда я редактирую фильм и меняю дату выпуска, все в порядке. Однако, если добавить фильм (даже если его же MovieForm), я получаю это исключение:

Превращение Datetime2 типа данных в тип данных даты и времени привело к значению вне-диапазона. Заявление было прекращено.

Я попытался пройти через все это и попытаться поймать попытку, но ошибка выше, это единственное, что я могу извлечь из того, что происходит. Мне просто не кажется, что я могу редактировать и успешно писать в базу данных, используя ту же самую форму и то же самое действие Save(), но по какой-то причине, когда дело доходит до создания новой записи, она не работает. Это даже будет работать, если я введу дату точно так же непосредственно в БД.

Я также видел this question, однако он не касается вопроса, который у меня есть. Я даже представить как мои действия здесь, так что вы можете увидеть их:

public ActionResult Edit(int id) 
     { 
      var movie = _context.Movies.SingleOrDefault(m => m.Id == id); 
      //Make sure that the id actually exists: 
      if (movie == null) 
      { 
       return HttpNotFound(); 
      } 
      var viewModel = new MovieFormViewModel 
      { 
       Movie = movie, 
       IsNew = false, 
       Genres = _context.Genres.ToList() 
      }; 
      return View("MovieForm", viewModel); 
     } 

     public ActionResult Save(Movie movie) 
     { 
      if (movie.Id == 0) 
      { 
       _context.Movies.Add(movie); 
      } 
      else 
      { 
       //This method of data entry allows you to explicitly control which items in the Db can be updated by the user. More secured than an update-all method like TryUpdateModel() 
       var movieInDb = _context.Movies.Single(c => c.Id == movie.Id); 
       movieInDb.ReleaseDate = movie.ReleaseDate; 
       movieInDb.Name = movie.Name; 
       movieInDb.Genre = movie.Genre; 
       movieInDb.NumberInStock = movie.NumberInStock; 
       movieInDb.DateAdded = DateTime.Today.Date; 
      } 

       _context.SaveChanges(); 


      return RedirectToAction("Index", "Movies"); 
     } 
public ActionResult New() 
     { 
      var genres = _context.Genres.ToList(); 
      var viewModel = new MovieFormViewModel 
      { 
       Genres = genres, 
       IsNew = true 
      }; 
      return View("MovieForm", viewModel); 
     } 

Обратите внимание, что исключение возникающего на _context.SaveChanges() метод. Также обратите внимание, что я попытался удалить movieInDb.DateAdded = DateTime.Today.Date; но это не имеет к этому никакого отношения, поскольку я добавил его после того, как я столкнулся с этим исключением с ReleaseDate. Я также попытался сыграть с форматированием DateTime ReleaseDate, который тоже не помог.

+1

ошибка возникает, потому что 'ReleaseDate' или' 'DateAdded' является DateTime.MinDate' (01/01/0001) и находится за пределами допустимого диапазона. (вы не указываете значение 'DateAdded' при добавлении нового' Movie') –

+0

Я не понимаю, как ReleaseDate может быть MinDate, когда я ввел дату в текстовое поле и нажал submit. –

+0

Затем его 'DateAdded' - отлаживает ваш код! –

ответ

2

В действии Save() в MovieController внимательно посмотрите на оператор if. Поскольку исключение происходило только при добавлении нового фильма, это означает, что возникла проблема в случае, когда movie.Id == 0 (новый фильм). Проблема заключалась в том, что свойство movie.DateAdded было , а не, заданное формой, поэтому оно никогда не устанавливалось вообще. Это заставило movie.DateAdded быть пустым и, таким образом, выбрасывало исключение. Исправление - установить movie.DateAdded равным текущей дате до того фиксации в базу данных следующим образом:

if (movie.Id == 0) 
      { 
       movie.DateAdded = DateTime.Now; 
       _context.Movies.Add(movie); 
      } 
Смежные вопросы