2015-06-13 6 views
1

Я пытаюсь удалить строку из таблицы в моей базе данных, но я продолжаю получать null reference exception.Удаление строки с использованием рамки сущности

Я знаю, что код, который я написал, не захватывает идентификационный номер ComboBox, но я не знаю, как его исправить.

Вот код, у меня есть:

private void btnDelete_Click(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     //select row to delete 
     Doctor del = ((Doctor)cbDocIdd.SelectedItem); 
     Doctor deleted = (from d in MainWindow.nlh.Doctors 
          where d.DoctorID == del.DoctorID 
          select d).First(); 
     //delete row from db 
     MainWindow.nlh.Doctors.DeleteObject(deleted); 
     //Save to database 
     MainWindow.nlh.SaveChanges(); 
     MessageBox.Show("Doctor deleted"); 
     this.Close(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

Любая помощь будет принята с благодарностью.

Это код, который используется для заполнения выпадающий:

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     cbDocIdd.DataContext = MainWindow.nlh.Doctors; 
    } 
+1

Вы уверены, что врач с этим id существует. –

+0

есть. combobox заполняется из базы данных. – Nat

+0

Итак, где * происходит эта NRE? –

ответ

2

Вы должны использовать .FirstOrDefault и проверку был ли найден действительный объект:

//select row to delete 
Doctor del = ((Doctor)cbDocIdd.SelectedItem); 
Doctor deleted = (from d in MainWindow.nlh.Doctors 
        where d.DoctorID == del.DoctorID 
        select d).FirstOrDefault(); 

// check if it even exists!! 
if(deleted != null) 
{ 
    //delete row from db 
    MainWindow.nlh.Doctors.DeleteObject(deleted); 
    //Save to database 
    MainWindow.nlh.SaveChanges(); 
    MessageBox.Show("Doctor deleted"); 
    this.Close(); 
} 

Если вы используете .First() и врач с данным идентификатором не существует, вы получите исключение

Также: убедитесь, что del Значение в порядке и не имеет значения перед использованием его в следующей инструкции. То же самое касается MainWindow - вы уверены, что это не null?

Обновление: Можете ли вы попробовать эти две строки и сказать мне, какой результат?

//select row to delete 
object selectedObj = cbDocIdd.SelectedItem; 

if(selectedObj != null) 
{ 
    string typeOfSelectedObj = selectedObj.GetType().Name; 
} 

Doctor del = ((Doctor)cbDocIdd.SelectedItem); 

selectedObj что-то иное, чем null? И если да: то, что типа это ??

Обновление № 2: ОК - так врач существует и возвращается ОК - можете ли вы попробовать это для меня ??

Заменить строку:

Doctor del = ((Doctor)cbDocIdd.SelectedItem); 

с этим вместо того, чтобы:

Doctor del = cbDocIdd.SelectedItem as Doctor; 

При запуске этого - это del сейчас что-то другое, чем null?

Решение:

В конце концов, реальной причины, почему этот код сломал заключается в том, что вызов MainWindow.nlh.Doctors.DeleteObject(deleted); вызвал обработчик события огня, который включил этот код:

private void cbDocIdd_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    // populate with DoctorID from db 
    Doctor deletedDoc = ((Doctor)cbDocIdd.SelectedItem); 
    tbLastName.Text = deletedDoc.LastName.ToString(); 
    tbFirstName.Text = deletedDoc.FirstName.ToString(); 
    tbLicenseNumber.Text = deletedDoc.LicenseNumber.ToString(); 
} 

, но в этой ситуации, когда врач удаляется, deletedDoc был возвращен как NULL, но проверка не действительна, чтобы обеспечить доступ только к не-NULL объект ..... поэтому, при попытке доступа к свойству deletedDoc.LastName было брошено печально известное «исключение для ссылки на нуль»

+0

Я пробовал это с помощью .FirstOrDefault(), и это не помогает, потому что идентификатор существует (это школьный проект, а combobox заполняется прямо из db, только с действительными идентификаторами). del возвращается, но я не могу понять, что я делаю неправильно. – Nat

+0

Это, как он заполнен: – Nat

+0

личное недействительным cbDocIdd_SelectionChanged (объект отправителя, SelectionChangedEventArgs е) { // заселить с DoctorID из БД Доктор deletedDoc = ((Доктор) cbDocIdd.SelectedItem); tbLastName.Text = deletedDoc.LastName.ToString(); tbFirstName.Text = deletedDoc.FirstName.ToString(); tbLicenseNumber.Text = deletedDoc.LicenseNumber.ToString(); } – Nat

0

"null reference exception" показывает, когда вы пытаетесь использовать метод, содержащий нулевое значение.

Например, если произведение имеет нулевое значение или присвоено нулевому значению, например product = null, то вы не можете использовать метод как product.count() или что-то, потому что null.count() не поддерживается.

Doctor deleted = (from d in MainWindow.nlh.Doctors 
         where d.DoctorID == del.DoctorID 
         select d).FirstOrDefault(); 

use this and check null. 
Смежные вопросы