我正在使用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
都被丢弃了。
有人能给我解释一下吗?
1条答案
按热度按时间efzxgjgh1#
当你写LINQ的时候,你写了一个查询,这个查询只在代码的另一部分需要数据的时候才被执行。
在本例中,返回
myElement
变量是因为使用了.First()
,它强制执行查询并返回第一个项。属性
elements_localisation
和elements_files
很可能是虚拟属性,只有在您请求它们时才会加载。(实体框架肯定是这种情况,我不确定您在这里使用的是什么)。您的程序将尝试访问虚拟属性,然后它将转到数据上下文以获取您请求的下一位数据,但在您的情况下,数据上下文已被释放。
第二种方法之所以有效,是因为在虚拟属性上使用了
ToList()
,这会强制在释放数据上下文之前立即检索数据。