1

MVC でエンティティ フレームワークをいじっていますが、「遅延読み込み」に関する問題に遭遇したようです。よく知られている映画データベースからデータをスクレイピングし、ユーザーがこのデータをデータベースに保存できるようにする単純な Web アプリケーションがあります。タイトル、リリース日、監督などの詳細を含む Film クラスがあります。また、Genre クラスもあり、Film クラス内にジャンルのコレクションがあります。

私が抱えている問題は、ビューに IEnumerable クエリを渡したいときに、ジャンル情報を読み込めないように見えることです。

フィルムクラスは次のとおりです。

 public class Film
{
    [Key]
    public int FilmId { get; set; }
    public string FilmTitle { get; set; }
    public int FilmReleaseYear { get; set; }
    public string FilmDirector { get; set; }
    public string FilmRating { get; set; }
    public string FilmImageUrl { get; set; }
    public string FilmImdbUrl { get; set; }
    public virtual ICollection<Genre> FilmGenres { get; set; }
    public virtual ICollection<FilmCastMember> FilmCastList { get; set; }
    public virtual ICollection<FilmReview> FilmReviews { get; set; }

    public Film()
    {
        FilmGenres = new List<Genre>();
        FilmCastList = new List<FilmCastMember>();
        FilmReviews = new List<FilmReview>();
    }
}

ここに私のジャンルクラスがあります:

public class Genre
{   
    [Key]
    public int GenreId { get; set; }
    public string GenreType { get; set; }
}

これが私のアクションメソッドです

public ActionResult MyFilms()
    {
        IEnumerable<Film> films = from film in db.Films.Include("Genres")
                                  select film;

        return View(films);
    }

私が抱えている問題は、このメソッドのビューにいるときに、foreach ループを使用して映画の GenreType にアクセスしようとしたが、そのオプションが表示されないことです。すべてのデータはデータベース内でリンクされているため、何が間違っているのかわかりません。どんな助けでも素晴らしいでしょう。

新しいアクション メソッド:

public ActionResult MyFilms()
    {
        IEnumerable<Film> films = from film in db.Films.Include("FilmReviews").Include("FilmGenres").Include("FilmCastList")
                                  select film;

        return View(films);
    }

そのメソッドの新しいビュー:

 @model IEnumerable<MvcFilmFinder.Models.Film>

 @{
     ViewBag.Title = "MyFilms";
  }

  @foreach (var film in Model)
  {
      <h2>@film.FilmTitle</h2>
      <img src="@film.FilmImageUrl" alt="@film.FilmTitle" />

      foreach (var genre in film.FilmGenres)
      {
         <p>@genre.GenreType</p>
      }

      foreach (var genre in film.FilmGenres)
      {
         <p>@genre.GenreId</p>
      }

      foreach (var review in film.FilmReviews)
      {
         <p>@review.ReviewAuthor</p>
      }
  }
4

1 に答える 1

1

コントローラーのコードを次のように変更します。

public ActionResult MyFilms()
{
    var films = from film in db.Films.Include("FilmGenres")
                select film;

    return View(films);
}

ビューは次のようになります。

@model IEnumerable<projectname.Models.Film>

@foreach (var film in Model)
{
    foreach (var genre in film)
    {
        // genre stuff
    }
}
于 2013-04-13T23:40:28.627 に答える