1

您好,我正在编写一个 ASP.Net MVC 应用程序,并且我有一个专用于数据库连接的特殊类。在我的 HomeController 中,我调用了这个特殊 DB 类的静态方法,它将所需的数据返回到对象中。我使用实体框架来实现这一点。但是,当我尝试使用控制器中的列表时,我遇到了一个奇怪的异常。我认为问题在于我有一个虚拟内部集合,该集合在实体框架方法完成后被处置。我可以访问主组字段,但无法访问内部列表。这是我的模型:

public partial class Teacher
{
    public Teacher()
    {
        this.TeacherRelationships = new List<TeacherRelationship>();
        this.CourseTemplates = new List<CourseTemplate>();
        this.Orders = new List<Order>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string DescriptionText { get; set; }
    public Nullable<int> Phone { get; set; }
    public string Email { get; set; }
    public string PictureFilePath { get; set; }
    public virtual ICollection<TeacherRelationship> TeacherRelationships { get; set; }
    public virtual ICollection<CourseTemplate> CourseTemplates { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
}

当我尝试获取 CourseTemplate 结果时,我得到了这个异常:

异常详细信息:System.ObjectDisposedException:ObjectContext 实例已被释放,不能再用于需要连接的操作。

我试图单独调查它,但我发现的一切都是返回列表而不是查询的建议。这也是我的 DBConnection 方法的代码:

    public static List<Teacher> returnAllTeachers()
    {
        using (var db = new Context())
        {
            var query = from th in db.Teachers
                        select th;

            return query.ToList();
        }
    }

我究竟做错了什么?

4

1 回答 1

4

您的原始查询仅加载Teacher对象。这些集合被设置为延迟加载,直到您访问它们才被获取。不幸的是,此时您的 objectcontext 已关闭,因此您无法再从数据库中获取任何内容。

最好的解决方法是更新查询以预先加载您要使用的附加数据:

var query = from th in db.Teachers.Include(t => t.Orders)
            select th;

您还必须添加 ausing System.Data.Entity才能访问Include()采用 lambda 的方法。不要使用带弦的那个。

于 2013-11-12T11:39:33.783 回答