0

私は MVC4 と EF5 を使用しており、次のページの Contoso University のチュートリアルに取り組んでいます: http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc- 4/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application

Entity Framework モデル クラスの関連部分:

public class Student
{
    public int StudentID { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

public enum Grade { A,B,C,D,F}
public class Enrollment
{
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    public Grade? Grade { get; set; }
    public Course Course { get; set; }
    public Student Student { get; set; }
}

public class Course
{
    public int CourseID { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

コントローラーで:

public ActionResult Details(int id = 0) {
    Student student = db.Students.Find(id);
    return View(student);
}

ビューの関連ビット:

@foreach (var item in Model.Enrollments) {
    <tr>
    <td>
        @Html.DisplayFor(modelItem => item.Course.Title) //this does not display as Course is null
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Grade)
    </td>
    </tr>
}

チュートリアルの内容に反して、私の場合、ビューにはコースのタイトルは表示されず、成績のみが表示されます。

Course Title    Grade
                A
                C
                B

デバッグは、Course プロパティ (Course への外部キーを表す) が null であることを示しています。つまり、学生ごとに Enrollments コレクションが読み込まれますが、これらの登録では Course プロパティが読み込まれていません。Eager Loading を使用して各 Enrollment の Course プロパティを読み込む方法がわかりません。コース タイトルをビューに表示するにはどうすればよいですか?

ハードコーディングされた「インクルード」文字列が(コントローラーで)機能することがわかりました。

Student student = db.Students.Where(x => x.StudentID == id).Include("Enrollments.Course").Single();

しかし、ラムダ関数やその他の関数でそれを行う方法がわかりません。

次のことを試しましたが、成功しませんでした:

Student student = db.Students.Where(x => x.StudentID == id).Include(y => y.Enrollments.Course).Single();
Student student = db.Students.Where(x => x.StudentID == id).Include(y => y.Enrollments).Include(z => z.Enrollments.Course).Single();
4

1 に答える 1

2

C# ファイルでこれを忘れないでください。

using System.Data.Entity;

編集:

または、遅延読み込みのために Course プロパティを virtual としてマークするだけです

public class Enrollment
{

        public virtual Course Course { get; set; }
        public virtual Student Student { get; set; }
}
于 2013-11-08T14:19:15.377 に答える