2

プロジェクトでEntity Frameworkを使用しています。この問題はよく知られていますが、想定される解決策 (例: thisおよびthis ) は機能しません。

/// <summary>
/// Returns complete list of lecturers from DB.
/// </summary>
public IEnumerable<Lecturer> GetAllLecturers()
{
    IList<Lecturer> query;
    using (var dbb = new AcademicTimetableDbContext())
    {
        query = (from b in dbb.Lecturers select b).ToList();
    }
    Debug.WriteLine(query[0].AcademicDegree); // Exception (***)
    return query;
}

例外 (***):

ObjectContext インスタンスは破棄されており、接続を必要とする操作には使用できなくなりました。

public class Lecturer
{
    public Lecturer()
    {
        this.Timetables = new List<Timetable>();
        this.Courses = new List<Course>();
    }

    public int Id_Lecturer { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Phone_Number { get; set; }
    public Nullable<int> Academic_Degree_Id { get; set; }
    public virtual AcademicDegree AcademicDegree { get; set; }
    public virtual ICollection<Timetable> Timetables { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}

どうしたの?

4

1 に答える 1

4

遅延読み込みはあなたのDbContext命まで機能します。

ブロック外のナビゲーション プロパティにアクセスしようとすると、EF は例外をスローしますusingDbContextusing

例外をスローしないブロックDebug.WriteLine内を移動して、これをテストできます。using

using (var dbb = new AcademicTimetableDbContext())
{
    query = (from b in dbb.Lecturers select b).ToList();
    Debug.WriteLine(query[0].AcademicDegree);
}

そして解決策は、ナビゲーション プロパティを usingメソッドで積極的に読み込むように EF に指示することです。Include

using (var dbb = new AcademicTimetableDbContext())
{
    query = (from b in dbb.Lecturers.Include(l => l.AcademicDegree) select b)
      .ToList();

}
Debug.WriteLine(query[0].AcademicDegree);
于 2012-11-10T14:03:35.853 に答える