Entity Framework NullReferenceException после SaveChanges - PullRequest
0 голосов
/ 20 сентября 2011

У меня проблема с сохранением изменений в моей базе данных. У меня есть простая база данных с 3 таблицами, которые все связаны между собой.

У меня есть список всех моих проектов:

public void fillProjekteListBox()
    {
        //Füllt die Listbox mit Einträgen
        projekteLstProjekte.DataSource = dBQueriesObj.createProjektQuery();
        projekteLstProjekte.DisplayMember = "Projektname";
    }

Метод createProjektQuery создает запрос со всеми моими проектами:

public ObjectQuery createProjektQuery()
    {
    // Erstellt eine Query mit allen Projekten und sortiert sie nach Projektname, gibt ein 
    //ObjectQuery Objekt zurück
    var ProjektnameQuery = from d in profilmanagerObj.Projekte
                          orderby d.Projektname
                          select d;
    return (ObjectQuery)ProjektnameQuery;
    }

Хорошо, если я сейчас скомпилирую проект, все в порядке, я могу выбрать все свои проекты через ListBox. Следующим, что я хотел, было показать в списке Компанию, которая связана с текущим выбранным проектом, поэтому я создал следующий запрос:

public List<Firma> createFirmaQuery(ListBox listBoxIncoming)
    {
        Projekte gewähltesProjekt = (Projekte)listBoxIncoming.SelectedItem;
         var FirmaQuery = from d in profilmanagerObj.Firma
                             where d.ProjektID == gewähltesProjekt.ProjekteID
                             orderby d.ProjektID
                             select d;
            List<Firma> selectedFirma = FirmaQuery.ToList();
            return selectedFirma;
    }

Затем я создал объект моей таблицы и подключил его к selectedFirma:

currentFirma = dBQueriesObj.createFirmaQuery(projekteLstProjekte).First();

И, наконец, я установил текст из текстового поля на название компании, которая связана с проектом:

projekteTxtFirma.Text = currentFirma.Firmaname;

Все работает абсолютно правильно, если я изменю проект, название компании изменится на правильное.

Но теперь проблема: конечно, иногда необходимо что-то редактировать, например имя проекта. Поэтому мне нужна функция сохранения, и для ее тестирования я создал следующую строку кода:

private void projekteBtnProjekteSave_Click(object sender, EventArgs e)
    {
        currentProjekt.Projektname = projekteTxtProjektname.Text;
        dBQueriesObj.Save();
    }

Но если я нажимаю на кнопку сохранения (после изменения названия проекта), я получаю следующую ошибку:

NullReferenceException

в этой строке:

List<Firma> selectedFirma = FirmaQuery.ToList();

этот фрагмент кода относится к методу createFirmaQuery, который я описал выше. Кто-нибудь может дать мне Clou?


Хорошо, я просто вышлю вам весь код, просто для информации: это приложение для Windows Forms. Ее основная форма:

namespace Profilmanager { открытый частичный класс Form1: Form { общедоступный Form1 () { InitializeComponent (); }

    //All attributes
    private DBqueries dBQueriesObj = new DBqueries();
    private Firma currentFirma;
    private Projektnotizen currentProjektnotiz;
    private Projekte currentProjekt;

    //Edit button is clicked
    private void projekteBtnProjekteEdit_Click(object sender, EventArgs e)
    {
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        fillProjekteListBox();
    }

    //Methode zum befüllen der Listbox mit Notizen
    public void refillListboxProjektnotizen()
    {
        projekteLstbNotizen.DataSource = dBQueriesObj.createProjektnotizQuery(projekteLstProjekte);
        projekteLstbNotizen.DisplayMember = "Notiztext";
    }

    public void fillProjekteListBox()
    {
        //Füllt die Listbox mit Einträgen
        projekteLstProjekte.DataSource = dBQueriesObj.createProjektQuery();
        projekteLstProjekte.DisplayMember = "Projektname";
    }

    private void projekteLstProjekte_SelectedIndexChanged(object sender, EventArgs e)
    {
        fillAllTheBoxes();
    }

    public void fillAllTheBoxes()
    {
        //Das Objekt currentFirma der Klasse Firma wird mit dem returnwert von createFirmaQuery gefüllt.
        //First() benötigt man um das erste Element einer Liste zurück zu geben.
        //Gleiches passiert mit currentProjekt und currentProjektnotiz
        currentFirma = dBQueriesObj.createFirmaQuery(projekteLstProjekte).First();
        currentProjekt = dBQueriesObj.createProjekteQuery(projekteLstProjekte).First();
        currentProjektnotiz = dBQueriesObj.createProjektnotizQuery(projekteLstProjekte).First();

        //Die Textboxen, die die Firma repräsentieren werden gefüllt.
        projekteTxtFirma.Text = currentFirma.Firma1;
        projekteTxtFirmaabteilung.Text = currentFirma.Abteilung;
        projekteTxtFirmaansprechpartner.Text = currentFirma.Ansprechpartner;
        projekteTxtFirmatele.Text = currentFirma.Telefonnummer;
        projekteTxtFirmastraße.Text = currentFirma.Straße + " " + currentFirma.Hnr;
        projekteTxtFirmaPLZ.Text = currentFirma.PLZ.ToString();
        projekteTxtFirmaOrt.Text = currentFirma.Ort;
        projekteTxtFirmaLand.Text = currentFirma.Land;
        projekteTxtFirmapostfach.Text = currentFirma.Postfach;
        projekteTxtFirmafax.Text = currentFirma.Fax;
        projekteTxtFirmaemail.Text = currentFirma.Email;

        //Aktualisiert die Listbox mit den Projektnotizen
        refillListboxProjektnotizen();

        //updates the projekt textboxes
        projekteTxtProjektname.Text = currentProjekt.Projektname;
        projekteTxtProjektstart.Text = currentProjekt.Start.Value.ToShortDateString();
        projekteTxtProjektdauer.Text = currentProjekt.Dauer;
        projekteTxtProjektanforderungen.Text = currentProjekt.Anforderungen;
    }

    //Speichert Die Datenbank
    private void projekteBtnProjekteSave_Click(object sender, EventArgs e)
    {
        currentProjekt.Projektname = projekteTxtProjektname.Text;
        dBQueriesObj.Save();
    }
}

}

и это класс, который содержит запросы и метод сохранения:

namespace Profilmanager { Класс DBqueries { // Erstellt den Context des Entity. private ProfilmanagerEntities profilmanagerObj = new ProfilmanagerEntities ();

    public void Save()
    {
        profilmanagerObj.SaveChanges();
    }


    public ObjectQuery createProjektQuery()
    {
    // Erstellt eine Query mit allen Projekten und sortiert sie nach Projektname, gibt ein ObjectQuery Objekt zurück
    var ProjektnameQuery = from d in profilmanagerObj.Projekte
                          orderby d.Projektname
                          select d;
    return (ObjectQuery)ProjektnameQuery;
    }

    // Erstellt eine Query mit allen Projektnotizen zum in listBoxIncoming gewählten Projekt 
    // und sortiert sie nach ProjektID, gibt ein List Objekt zurück.
    public List<Projektnotizen> createProjektnotizQuery(ListBox listBoxIncoming)
    {
        Projekte gewähltesProjekt = (Projekte)listBoxIncoming.SelectedItem;
        var ProjektnotizenQuery = from d in profilmanagerObj.Projektnotizen
                               where d.ProjektID == gewähltesProjekt.ProjekteID
                               orderby d.ProjektID
                               select d;
        List<Projektnotizen> selectedNotizen = ProjektnotizenQuery.ToList();
        return selectedNotizen;
    }

    // Erstellt eine Query mit allen Firma zum in listBoxIncoming gewählten Projekt 
    // und sortiert sie nach ProjektID, gibt ein List Objekt zurück.
    public List<Firma> createFirmaQuery(ListBox listBoxIncoming)
    {
        Projekte gewähltesProjekt = (Projekte)listBoxIncoming.SelectedItem;
         var FirmaQuery = from d in profilmanagerObj.Firma
                             where d.ProjektID == gewähltesProjekt.ProjekteID
                             orderby d.ProjektID
                             select d;
            List<Firma> selectedFirma = FirmaQuery.ToList();
            return selectedFirma;
    }

    // Erstellt eine Query mit allen Deatails zum in listBoxIncoming gewählten Projekt 
    // und sortiert sie nach ProjektID, gibt ein List Objekt zurück.
    public List<Projekte> createProjekteQuery(ListBox listBoxIncoming)
    {
        Projekte gewähltesProjekt = (Projekte)listBoxIncoming.SelectedItem;
        var ProjekteQuery = from d in profilmanagerObj.Projekte
                         where d.ProjekteID == gewähltesProjekt.ProjekteID
                         orderby d.ProjekteID
                         select d;
        List<Projekte> selectedProjekt = ProjekteQuery.ToList();
        return selectedProjekt;
    }
}

}

Это весь проект, это скриншот из приложения:

http://picfront.de/d/8mdV

...