【问题标题】:Entity Framework/ASP.NET MVC 5 DateTime Exception实体框架/ASP.NET MVC 5 日期时间异常
【发布时间】:2016-07-21 06:51:33
【问题描述】:

我的 MovieController 中有 Add 和 Edit 动作,它们都转到 MovieForm 视图。在 MovieForm 视图中,我有以下内容:

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

另见我对应的电影模型:

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; }
    }
}

如您所见,ReleaseDate 属性似乎没有任何问题。在数据库 (localDB) 中,它的类型为“datetime”。

但是,奇怪的是,每当我编辑电影并更改发行日期时,一切都很好。但是,如果我添加一部电影(即使它是相同的 MovieForm),我会得到这个异常:

将 datetime2 数据类型转换为 datetime 数据类型 导致超出范围的值。声明已终止。

我已尝试逐步完成所有操作并尝试尝试捕获,但上述错误是我可以从正在发生的事情中提取的唯一内容。对我来说,我可以使用完全相同的表单和完全相同的 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 的这个异常之后添加了它。我还尝试使用 ReleaseDate 的 DateTime 格式,但这也没有帮助。

【问题讨论】:

  • 抛出错误是因为ReleaseDateDateAddedDateTime.MinDate (01/01/0001) 并且超出范围。 (添加新的Movie 时,您似乎没有设置DateAdded 的值)
  • 当我在文本字段中输入日期并单击提交时,我不明白 ReleaseDate 怎么可能是 MinDate。
  • 然后是DateAdded - 调试你的代码!
  • 调试器告诉我“ReleaseDate 在当前上下文中不存在”,但事实并非如此 - 表单中正确包含 @Html.TextBoxFor(m =&gt; m.Movie.ReleaseDate, "{0:MMM dd yyyy}", new { @class = "form-control" })。在完全相同的模型中,其他所有属性都可以正常工作。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

在 MovieController 的 Save() Action 中,仔细查看 if 语句。由于仅在添加新电影时才发生异常,这意味着在 movie.Id == 0(新电影)的情况下存在问题。问题在于,movie.DateAdded 属性没有被表单设置,因此它根本没有被设置。这导致 movie.DateAdded 为 null 并因此引发异常。修复 - 设置 movie.DateAdded 等于当前日期之前提交到数据库,如下所示:

if (movie.Id == 0)
            {
                movie.DateAdded = DateTime.Now;
                _context.Movies.Add(movie);
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多