DataContext处理错误已解决,但为什么?

时间:2013-09-11 10:02:59

标签: asp.net vb.net

我正在使用VB.Net。我已经解决了一个行为,其中代码返回错误“无法访问已处置的对象。对象名称:'在Dispose之后访问DataContext'。”。 我的问题:我根本不明白它为什么会起作用! 发生错误时,这是​​我的代码:

Public Function Element_Import(ByVal id_element As Integer) As elements

    Using db As New GlobalDataContext(MyConnexion)

        Return (From element In db.elements
                Select element
                Where element.id_element = id_element).First
    End Using

End Function

然后我尝试撤回数据:

Dim myElement As elements = _MyConnection.Element_Import(id_element)
Dim myLocal As List(Of elements_localisation) = myElement.elements_localisation.ToList '-- ObjectDisposedException !

当我导入我的元素然后尝试访问名为“elements_localisation”和“elements_files”的子表时会发生ObjectDisposedException。这是公平的,因为DataContext不可用。

所以我做了不同的事情:

 Public Function Element_ImportContext(ByVal id_element As Integer) As elements
    Dim myElement As elements
    Dim myElementLocalisation As New List(Of elements_localisation)
    Dim myElementFiles As New List(Of elements_files)
    Using db As New GlobalDataContext(MyConnexion)
        myElement = (From element In db.elements
                Select element
                Where element.id_element = id_element).First

        myElementLocalisation = myElement.elements_localisation.ToList
        myElementFiles = myElement.elements_files.ToList
    End Using
    Return myElement

End Function

然后我尝试撤回数据:

Dim myElement As elements = _MyConnection.Element_ImportContext(id_element)
Dim myLocal As List(Of elements_localisation) = myElement.elements_localisation.ToList '-- IT WORKS !

我真的想了解发生了什么,因为在这两种情况下,DataContext都被处理掉了。

任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

当您编写LINQ时,您编写了一个针对某些数据执行的查询,该查询仅在代码的另一部分需要数据时执行。

在您的情况下,您将返回myElement变量,因为您使用了.First(),这会强制执行查询并返回第一个项目。

属性elements_localisationelements_files可能是仅在您请求时加载的虚拟属性。 (实体框架肯定是这种情况,我不确定你在这里使用的是什么)。

您的程序将尝试访问虚拟属性,然后该虚拟属性将转到数据上下文以获取您请求的下一位数据,但在您的情况下,数据上下文将被丢弃。

您的第二种方法是有效的,因为您在虚拟属性上使用了ToList(),这会强制在数据上下文处理之前检索数据。