尝试从List接收数据时System.ObjectDisposedException

时间:2013-11-12 11:34:17

标签: c# .net linq entity-framework

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

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实例已被释放,不能再用于需要连接的操作。

我试图单独调查它,但我找到的所有内容都是建议返回List而不是查询。这也是我的DBConnection方法的代码:

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

            return query.ToList();
        }
    }

我做错了什么?

1 个答案:

答案 0 :(得分:4)

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

最佳解决方法是将查询更新为急切加载您要使用的其他数据:

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

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