asp.net DataContext Disposal错误已解决,但为什么?

dbf7pr2w  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(97)

我正在使用VB.NET。我已经解决了代码返回错误的行为
无法访问已释放的对象。对象名称:“在释放后访问的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都被丢弃了。
有人能给我解释一下吗?

efzxgjgh

efzxgjgh1#

当你写LINQ的时候,你写了一个查询,这个查询只在代码的另一部分需要数据的时候才被执行。
在本例中,返回myElement变量是因为使用了.First(),它强制执行查询并返回第一个项。
属性elements_localisationelements_files很可能是虚拟属性,只有在您请求它们时才会加载。(实体框架肯定是这种情况,我不确定您在这里使用的是什么)。
您的程序将尝试访问虚拟属性,然后它将转到数据上下文以获取您请求的下一位数据,但在您的情况下,数据上下文已被释放。
第二种方法之所以有效,是因为在虚拟属性上使用了ToList(),这会强制在释放数据上下文之前立即检索数据。

相关问题