好的,请原谅我对gridview的引用。
所以我在一个名为getall()的类中有这个方法,它的作用是从实体框架模型获取特定表的entites集合,检查表是否存在然后使用linq进行查询(linq to实体)。这确实有用,因为我使用了一个断点,甚至创建了一个单独的测试项目来测试它。然而,当我将它与gridview绑定时,对我来说已经证明是困难的。
这是我使用的代码:
protected void Button2_Click(对象 发件人,EventArgs e)
{ dCollection d = new dCollection(); GridView1.DataSource = d.GetAll(); GridView1.DataBind(); }
但是我收到错误说:
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
我正在使用一个集合从类dcollection中获取所有方法,我的一个方法是getall,它将从表中获取所有记录。为什么这不起作用?
答案 0 :(得分:2)
此错误来自于您已绑定到GridView中尚未加载的某些导航属性。因此,当您调用DataBind()时,它会尝试“Lazy Load”那些导航属性,因为这发生在您的ObjectContext生存范围之外(即它已经被处理掉),您将收到此错误。
解决方案是“Eager Load”您的GridView正在使用的所有导航属性,或者禁用对象上下文的延迟加载。
在您的情况下,我建议始终禁用延迟加载,无论您是否急于加载导航属性,因为这样的Web应用程序是一个很好的做法,总是禁用延迟加载。禁用后,您仍可以根据需要显式加载相关数据,或者使用初始查询急切加载它们。
This post包含有关此问题的更详细讨论以及如何禁用延迟加载。
顺便说一下,测试项目工作的原因是因为你没有访问那些“未加载”的导航属性,因此不会发生LazyLoading。