首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架/ASP.NETMVC 5 DateTime异常

实体框架/ASP.NETMVC 5 DateTime异常
EN

Stack Overflow用户
提问于 2016-07-21 06:51:33
回答 1查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
@Html.TextBoxFor(m => m.Movie.ReleaseDate, "{0:MMM dd yyyy}", new { @class = "form-control" })

还请参阅我的相应电影模型:

代码语言:javascript
复制
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:

代码语言:javascript
复制
public class MovieFormViewModel
    {
        public IEnumerable<Genre> Genres { get; set; }
        public Movie Movie { get; set; }
        public bool IsNew { get; set; }
    }
}

因此,正如您所看到的,ReleaseDate属性似乎没有任何问题。在数据库(localDB)中,它的类型是"datetime“。

然而,奇怪的是,每当我编辑一部电影并改变发行日期,一切都很好。但是,如果我添加了一部电影(尽管它是相同的MovieForm),我就会得到这样的例外:

将datetime2数据类型转换为日期时间数据类型会导致超出范围的值。声明已被终止。

我已经试过所有的步骤,尝试尝试捕捉,但是上面的错误是我能从正在发生的事情中提取出来的唯一的东西。对我来说,使用完全相同的表单和完全相同的Save()操作来编辑和成功地写入数据库是没有意义的,但是由于某种原因,当涉及到创建一个新条目时,它就不能工作了。如果我以完全相同的方式将日期直接输入到DB中,它甚至会工作。

我也看到过this question,但是它并没有解决我正在处理的问题。我甚至会在这里提供我的这两种行为,这样你就可以看到它们:

代码语言:javascript
复制
 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,这也没有帮助。

EN

回答 1

Stack Overflow用户

发布于 2016-07-22 09:25:34

在MovieController中的Save()操作中,仔细查看if语句。因为只有在添加新电影时才会出现异常,这意味着在movie.Id == 0(新电影)的情况下出现了问题。问题是,movie.DateAdded属性是,而不是由表单设置的,因此根本没有设置它。这导致movie.DateAdded为null,从而引发异常。修复集movie.DateAdded等于提交数据库之前的当前日期,如下所示:

代码语言:javascript
复制
if (movie.Id == 0)
            {
                movie.DateAdded = DateTime.Now;
                _context.Movies.Add(movie);
            }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38496969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档