У меня есть добавление и редактирование действий в моем 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, который тоже не помог.
ошибка возникает, потому что 'ReleaseDate' или' 'DateAdded' является DateTime.MinDate' (01/01/0001) и находится за пределами допустимого диапазона. (вы не указываете значение 'DateAdded' при добавлении нового' Movie') –
Я не понимаю, как ReleaseDate может быть MinDate, когда я ввел дату в текстовое поле и нажал submit. –
Затем его 'DateAdded' - отлаживает ваш код! –