Как исправить ошибку нулевой ссылки в dbcontext в vb?

Мой код создается и запускается, но когда я ссылаюсь на 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

На какой строке ошибка? Обратите внимание, что .FirstOrDefault() может вернуться Nothing.

Andrew Morton 30.07.2019 21:21

Где создается previdenceContext?

RobertBaron 30.07.2019 23:24

@Andrew Morton: ошибка возникает в строке «patient = (From su In previdenceContext.Subjects»

Tyson Gibby 31.07.2019 00:23

@RobertBaron: я полагаю, что он создается при создании экземпляра в строке «Private previdenceContext As PrevidenceContext». Это правильное создание объекта в VB?

Tyson Gibby 31.07.2019 00:26

Упомянутая вами строка только объявляет переменную. Вам нужно создать экземпляр с New.

RobertBaron 31.07.2019 06:30

Это одна из причин, по которой контекстную переменную не следует объявлять на уровне класса. Он всегда должен быть объявлен и создан как можно ближе к моменту его использования, а затем как можно скорее после этого утилизирован.

Chris Dunaway 31.07.2019 15:34

@RobertBaron: это была моя проблема. Добавление «Нового», как вы предложили, устранило проблему.

Tyson Gibby 31.07.2019 23:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
131
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это должна быть ошибка, которую IntelliSense перехватывает.

В любом случае, вы избежите ошибки, если замените объявление: Private previdenceContext As PrevidenceContext с Private previdenceContext As New PrevidenceContext, однако ваш код все равно не будет работать, потому что previdenceContext не имеет данных.

Вероятно, вам не хватает строки кода для заполнения previdenceContext.

Добавление «Нового», как вы предложили, устранило проблему.

Tyson Gibby 31.07.2019 23:52

@Unconquered - Однако простое добавление New создает новую проблему - утечку памяти. Смотрите мой ответ.

RobertBaron 01.08.2019 10:57

Поскольку вы используете 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

Другие вопросы по теме