我正在使用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都被处理掉了。
任何人都可以解释一下吗?
答案 0 :(得分:1)
当您编写LINQ时,您编写了一个针对某些数据执行的查询,该查询仅在代码的另一部分需要数据时执行。
在您的情况下,您将返回myElement
变量,因为您使用了.First()
,这会强制执行查询并返回第一个项目。
属性elements_localisation
和elements_files
可能是仅在您请求时加载的虚拟属性。 (实体框架肯定是这种情况,我不确定你在这里使用的是什么)。
您的程序将尝试访问虚拟属性,然后该虚拟属性将转到数据上下文以获取您请求的下一位数据,但在您的情况下,数据上下文将被丢弃。
您的第二种方法是有效的,因为您在虚拟属性上使用了ToList()
,这会强制在数据上下文处理之前检索数据。