2016-07-21 16 views
1

私はMovieController内でMovieFormビューに移動するAddアクションとEditアクションを持っています。 MovieFormビューの中で、私は以下があります。Entity Framework/ASP.NET MVC 5 DateTime例外

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

あなたが見ることができるように、「はdoesnのReleaseDateプロパティで何か問題があるように見えます。データベース(localDB)では、タイプは "datetime"です。

しかし、私が映画を編集してリリース日を変更するときは、すべてが問題ありません。私は映画を(たとえその同じMovieFormが)追加した場合しかし、私はこの例外を取得:

datetimeデータ型 にDATETIME2データ型の変換は、範囲外の値になりました。ステートメントは終了されました。

私はすべてのステップを試してみましたが、try catchを試していますが、上記のエラーが起こっていることから抽出できる唯一のものです。まったく同じ形式と全く同じSave()アクションを使用してデータベースを編集して正常に書き込むことはできませんが、何らかの理由で新しいエントリを作成すると機能しません。私は日付をまったく同じ方法でDBに直接入力しても機能します。

私はまた、this questionを見たことがありますが、それは私が持っている問題に対処していません。あなたがそれらを見ることができるので、私もここに私の行動の両方を提供します:例外が_context.SaveChanges()メソッドで発生していることを

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

注意を。また、私はmovieInDb.DateAdded = DateTime.Today.Dateを削除しようとしました。 ReleaseDateでこの例外が発生した後に追加したものとは関係ありません。私はまた、どちらかを助けなかったReleaseDateのDateTimeフォーマットで遊んでみました。

+1

エラーがスローされます01/0001)、範囲外です。 (あなたは新しい 'Movie'を追加するときに' DateAdded'の値を設定しているようには見えません) –

+0

Dateフィールドに日付を入力してsubmitをクリックすると、ReleaseDateがMinDateになる方法がわかりません。 –

+0

その後、その 'DateAdded' - あなたのコードをデバッグしてください! –

答えて

2

MovieControllerのSave()アクションでは、ifステートメントを注意深く見てください。例外が新しい映画が追加されているときだけ起こっていたので、これはmovie.Id == 0(新しい映画)の場合に問題があったことを意味します。問題は、movie.DateAddedプロパティがフォームによって設定されているでないであったため、設定されていませんでした。これにより、movie.DateAddedがnullになり、例外がスローされました。修正 - セットする前にのようにデータベースにコミットし、現在の日付に等しいmovie.DateAdded: `ReleaseDate`または` DateAdded`は `DateTime.MinDate`(01 /ですので

if (movie.Id == 0) 
      { 
       movie.DateAdded = DateTime.Now; 
       _context.Movies.Add(movie); 
      } 
関連する問題