使用我的getall方法绑定gridview - 实体框架

时间:2010-09-13 17:41:00

标签: c# entity-framework collections linq-to-entities

好的,请原谅我对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,它将从表中获取所有记录。为什么这不起作用?

1 个答案:

答案 0 :(得分:2)

此错误来自于您已绑定到GridView中尚未加载的某些导航属性。因此,当您调用DataBind()时,它会尝试“Lazy Load”那些导航属性,因为这发生在您的ObjectContext生存范围之外(即它已经被处理掉),您将收到此错误。

解决方案是“Eager Load”您的GridView正在使用的所有导航属性,或者禁用对象上下文的延迟加载。

在您的情况下,我建议始终禁用延迟加载,无论您是否急于加载导航属性,因为这样的Web应用程序是一个很好的做法,总是禁用延迟加载。禁用后,您仍可以根据需要显式加载相关数据,或者使用初始查询急切加载它们。

This post包含有关此问题的更详细讨论以及如何禁用延迟加载。

顺便说一下,测试项目工作的原因是因为你没有访问那些“未加载”的导航属性,因此不会发生LazyLoading。