У меня проблема с сохранением изменений в моей базе данных.
У меня есть простая база данных с 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