Мой код создается и запускается, но когда я ссылаюсь на dbcontext во время выполнения, я получаю «System.NullReferenceException: 'Ссылка на объект не указывает на экземпляр объекта.'». Я использую контекст во многих других местах в решении, и он работает, но в других местах это С#. Это ВБ.
Imports DataServices
Imports Previdence.Domain.Model
Imports Previdence.Business.Model.Report
Namespace UserControls
Partial Class RemissionControl
Inherits UserControl
Private previdenceContext As PrevidenceContext
Private patient As Subject
Private remissionButtonStatus As Boolean?
Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Dim snapshotId As Guid = Utility.StringToGuid(Request.QueryString("snapshotId"))
patient = (From su In previdenceContext.Subjects
Join ep In previdenceContext.Episodes On su.SubjectId Equals ep.SubjectId
Join sn In previdenceContext.Snapshots On ep.SubjectId Equals sn.SnapshotId
Where sn.SnapshotId = snapshotId
Select su).FirstOrDefault()
remissionButtonStatus = patient.RemissionButtonOn
If remissionButtonStatus = True Then
remissionRButtonYes.Checked = True
remissionRButtonNo.Checked = False
Else
remissionRButtonYes.Checked = False
remissionRButtonNo.Checked = True
End If
End Sub
'TODO: getting null reference error on the dbcontext
Private Sub remissionRButtonYes_click() Handles remissionRButtonYes.CheckedChanged
If remissionRButtonYes.Checked = True Then
patient.RemissionButtonOn = True
Else patient.RemissionButtonOn = False
End If
previdenceContext.SaveChanges()
End Sub
Private Sub remissionRButtonNo_click() Handles remissionRButtonNo.CheckedChanged
If remissionRButtonNo.Checked = True Then
patient.RemissionButtonOn = False
Else patient.RemissionButtonOn = True
End If
previdenceContext.SaveChanges()
End Sub
End Class
End Namespace
Где создается previdenceContext?
@Andrew Morton: ошибка возникает в строке «patient = (From su In previdenceContext.Subjects»
@RobertBaron: я полагаю, что он создается при создании экземпляра в строке «Private previdenceContext As PrevidenceContext». Это правильное создание объекта в VB?
Упомянутая вами строка только объявляет переменную. Вам нужно создать экземпляр с New.
Это одна из причин, по которой контекстную переменную не следует объявлять на уровне класса. Он всегда должен быть объявлен и создан как можно ближе к моменту его использования, а затем как можно скорее после этого утилизирован.
@RobertBaron: это была моя проблема. Добавление «Нового», как вы предложили, устранило проблему.





Это должна быть ошибка, которую IntelliSense перехватывает.
В любом случае, вы избежите ошибки, если замените объявление:
Private previdenceContext As PrevidenceContext с Private previdenceContext As New PrevidenceContext, однако ваш код все равно не будет работать, потому что previdenceContext не имеет данных.
Вероятно, вам не хватает строки кода для заполнения previdenceContext.
Добавление «Нового», как вы предложили, устранило проблему.
@Unconquered - Однако простое добавление New создает новую проблему - утечку памяти. Смотрите мой ответ.
Поскольку вы используете previdenceContext в нескольких членах вашего класса, вы можете объявить его на уровне класса и создать его экземпляр в Sub New(). Контекст должен быть удален, поэтому ваш класс должен реализовать IDisposable и избавиться от previdenceContext.
Partial Class RemissionControl
Implements IDisposable
Inherits UserControl
Private previdenceContext As PrevidenceContext
Sub New()
' This is the parameterless constructor. If you have a constructor with
' parameter such as passing the connection string name, use it. Do what you
' you do in your C# code.
previdenceContext New PrevidenceContext()
End Sub
' Your class implementation ...
#Region "IDisposable Support"
Private disposedValue As Boolean ' To detect redundant calls
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not disposedValue Then
If disposing Then
' TODO: dispose managed state (managed objects).
If previdenceContext IsNot Nothing Then previdenceContext.Dispose()
End If
' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
' TODO: set large fields to null.
End If
disposedValue = True
End Sub
' TODO: override Finalize() only if Dispose(disposing As Boolean) above has code to free unmanaged resources.
'Protected Overrides Sub Finalize()
' ' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above.
' Dispose(False)
' MyBase.Finalize()
'End Sub
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above.
Dispose(True)
' TODO: uncomment the following line if Finalize() is overridden above.
' GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
На какой строке ошибка? Обратите внимание, что
.FirstOrDefault()может вернутьсяNothing.