Hjälp med programmeringsprojekt skolarbete!!

Permalänk
Medlem

Hjälp med programmeringsprojekt skolarbete!!

Hej!
Vi arbetar med ett skolprojekt i programmering. Vi håller på att bygga ett system där vi arbetar mot en databas.
Vi har byggt upp vår databas utifrån model-first och har då vissa relationer där klasserna är beroende av varandra.
Trots att vi skrivit fungerande kod för när man ska spara ett objekt som har en koppling till ett annat objekt av en annan klass
så fungerar det inte nu när vi gjort det igen för en annan klass. Vi har vår kod uppdelad i tre lager; view(gränssnitt), business och datalayer. Businesslayer i vårt fall fungerar bara som ett "genomskick" och gör inte något speciellt egentligen. Det huvudsakliga
funktioner finns i view och datalayer. Vi arbetar med winform.

I viewlayer ser koden ut på följande sätt för det vi ska göra, vi skickar med det som skrivs in i attribut och väljs i datagridview + combobox för att spara i databasen. Först provade vi att skapa ett objekt och bara skicka objektet men det funkade inte så vi fick göra såhär istället:
private void button3_Click(object sender, EventArgs e)
{

// Datalager.PersonAnsökan pa = new Datalager.PersonAnsökan();
// {

double FörsäkPersonnummer = Convert.ToDouble(textBox5.Text.ToString());
string FörsäkradFörnamn = textBox2.Text.ToString();
string FörsäkradEfternamn = textBox4.Text.ToString();
string FörsäkBolag = textBox3.Text.ToString();
//}

int anställd = Convert.ToInt32(comboBox2.SelectedIndex);

int försäktag = Convert.ToInt16(dataGridView1.CurrentRow.Cells["PFörsäkringstarId"].Value);

bl.SkapaPersonAnsökan(FörsäkPersonnummer, FörsäkradFörnamn, FörsäkradEfternamn,FörsäkBolag, anställd, försäktag);

{

MessageBox.Show("Sparad");
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox5.Clear();
}
}

I businesslayer:
public void SkapaPersonAnsökan(double FörsäkPersonnummer, string FörsäkradFörnamn, string FörsäkradEfternamn, string FörsäkBolag, int anställd, int försäktag)
{
dl.SkapaPersonAnsökan(FörsäkPersonnummer, FörsäkradFörnamn, FörsäkradEfternamn, FörsäkBolag, anställd, försäktag);
}

I datalayer:
public void SkapaPersonAnsökan(double FörsäkPersonnummer, string FörsäkradFörnamn, string FörsäkradEfternamn, string FörsäkBolag, int anställd, int försäktag)
{
using (var db = new Model1Container())
{
PersonAnsökan personansökan = new PersonAnsökan()
{
FörsäkradPersNr = FörsäkPersonnummer,
FörsäkradFnamn = FörsäkradFörnamn,
FörsäkradEnamn = FörsäkradEfternamn,
Försäkringsbolag = FörsäkBolag

};

var anst = from typ in db.AnställdSet
where typ.Anstnr == anställd
select typ;

var försäkringstagare = from item in db.PFörsäkringstagareSet
where item.PFörsäkringstarId == försäktag
select item;

foreach (var typ in anst)
{
Anställd a;
a = typ;
personansökan.Anställd = typ;

foreach (var item in försäkringstagare)
{
PFörsäkringstagare pf;
pf = item;
personansökan.PFörsäkringstagare = pf;
}

}

db.PersonAnsökanSet.Add(personansökan);

db.SaveChanges();

}

}

När vi försöker spara en personansökan får vi fel på db.SaveChanges som felar på pförsäkringstagare. Hittar inte varför. Har problem med mappning i min dator så kan inte testköra och kopiera in det exakta felmeddelandet, men felet hamnar på pförsäkringstagare. Förstår inte hur det kan bli så, är det någon som ser något direkt i vår kod?
Har som sagt använt "samma" kod tidigare och har funkat då.

Permalänk
Medlem

@lovarn

Alltid svårt att göra en grundlig felsökning utan att ha hela projektet framför sig, plus att det är sent söndag kväll... Men utifrån koden vi har fått så är det lite oklart vad PFörsäkringstagare är för typ, och var den typen specificerat i så fall. Är det en member i PersonAnsökan? Är den en egen klass? Det händer lite funky stuff här och där också, exempelvis block som öppnas trots att föregående rad har avslutats med semikolon, men det kanske är vettig syntax i språket som jag troligtvis inte har så bra koll på (gissar C#?)

Och sen kan det även vara värt att notera att om ni ber om hjälp för en uppgift som är en del av examination (labb-uppgifter eller betygsatta övningar) så måste ni hålla koll på potentiell plagiering, vilka konsekvenser det kan få om ni får hjälp och kopierar kod, samt hur ert lärosäte vill att ni ska göra för att undvika en sådan situation. Bara en liten vänlig varning

Lycka till!

Visa signatur

Vad har jag i min dator? Kopparrör.

Permalänk
Medlem

Sätt gärna in koden i Code-taggar så blir det väldigt mycket enklare att läsa och felsöka i koden!

Permalänk
Medlem
Skrivet av kirayatail:

@lovarn

Alltid svårt att göra en grundlig felsökning utan att ha hela projektet framför sig, plus att det är sent söndag kväll... Men utifrån koden vi har fått så är det lite oklart vad PFörsäkringstagare är för typ, och var den typen specificerat i så fall. Är det en member i PersonAnsökan? Är den en egen klass? Det händer lite funky stuff här och där också, exempelvis block som öppnas trots att föregående rad har avslutats med semikolon, men det kanske är vettig syntax i språket som jag troligtvis inte har så bra koll på (gissar C#?)

Och sen kan det även vara värt att notera att om ni ber om hjälp för en uppgift som är en del av examination (labb-uppgifter eller betygsatta övningar) så måste ni hålla koll på potentiell plagiering, vilka konsekvenser det kan få om ni får hjälp och kopierar kod, samt hur ert lärosäte vill att ni ska göra för att undvika en sådan situation. Bara en liten vänlig varning

Lycka till!

Tack!
Ja PFörsäkringstagare är en egen klass, likadant anställd. Det är C# vi skriver i 😊
Vi får använda oss av all kod vi hittar som vi vill använda, även ta hjälp av varandra i andra grupper så det är ingen fara. Vi är tacksamma för all hjälp vi kan få just nu så vi kan komma vidare! 🤣
Någon nedanför skrev att man kunde lägga in koden i taggar, hur går jag tillväga för att göra det?

Skickades från m.sweclockers.com

Permalänk
Hedersmedlem
Skrivet av lovarn:

Tack!
Ja PFörsäkringstagare är en egen klass, likadant anställd. Det är C# vi skriver i 😊
Vi får använda oss av all kod vi hittar som vi vill använda, även ta hjälp av varandra i andra grupper så det är ingen fara. Vi är tacksamma för all hjälp vi kan få just nu så vi kan komma vidare! 🤣
Någon nedanför skrev att man kunde lägga in koden i taggar, hur går jag tillväga för att göra det?

Skickades från m.sweclockers.com

[code]
Klistra in din kod här...
[/code]

Det blir såhär:

Klistra in din kod här...

Permalänk
Medlem
Skrivet av lovarn:

Hej!
Vi arbetar med ett skolprojekt i programmering. Vi håller på att bygga ett system där vi arbetar mot en databas.
Vi har byggt upp vår databas utifrån model-first och har då vissa relationer där klasserna är beroende av varandra.
Trots att vi skrivit fungerande kod för när man ska spara ett objekt som har en koppling till ett annat objekt av en annan klass
så fungerar det inte nu när vi gjort det igen för en annan klass. Vi har vår kod uppdelad i tre lager; view(gränssnitt), business och datalayer. Businesslayer i vårt fall fungerar bara som ett "genomskick" och gör inte något speciellt egentligen. Det huvudsakliga
funktioner finns i view och datalayer. Vi arbetar med winform.

I viewlayer ser koden ut på följande sätt för det vi ska göra, vi skickar med det som skrivs in i attribut och väljs i datagridview + combobox för att spara i databasen. Först provade vi att skapa ett objekt och bara skicka objektet men det funkade inte så vi fick göra såhär istället:

private void button3_Click(object sender, EventArgs e) { // Datalager.PersonAnsökan pa = new Datalager.PersonAnsökan(); // { double FörsäkPersonnummer = Convert.ToDouble(textBox5.Text.ToString()); string FörsäkradFörnamn = textBox2.Text.ToString(); string FörsäkradEfternamn = textBox4.Text.ToString(); string FörsäkBolag = textBox3.Text.ToString(); //} int anställd = Convert.ToInt32(comboBox2.SelectedIndex); int försäktag = Convert.ToInt16(dataGridView1.CurrentRow.Cells["PFörsäkringstarId"].Value); bl.SkapaPersonAnsökan(FörsäkPersonnummer, FörsäkradFörnamn, FörsäkradEfternamn,FörsäkBolag, anställd, försäktag); { MessageBox.Show("Sparad"); textBox2.Clear(); textBox3.Clear(); textBox4.Clear(); textBox5.Clear(); } } I businesslayer: public void SkapaPersonAnsökan(double FörsäkPersonnummer, string FörsäkradFörnamn, string FörsäkradEfternamn, string FörsäkBolag, int anställd, int försäktag) { dl.SkapaPersonAnsökan(FörsäkPersonnummer, FörsäkradFörnamn, FörsäkradEfternamn, FörsäkBolag, anställd, försäktag); } I datalayer: public void SkapaPersonAnsökan(double FörsäkPersonnummer, string FörsäkradFörnamn, string FörsäkradEfternamn, string FörsäkBolag, int anställd, int försäktag) { using (var db = new Model1Container()) { PersonAnsökan personansökan = new PersonAnsökan() { FörsäkradPersNr = FörsäkPersonnummer, FörsäkradFnamn = FörsäkradFörnamn, FörsäkradEnamn = FörsäkradEfternamn, Försäkringsbolag = FörsäkBolag }; var anst = from typ in db.AnställdSet where typ.Anstnr == anställd select typ; var försäkringstagare = from item in db.PFörsäkringstagareSet where item.PFörsäkringstarId == försäktag select item; foreach (var typ in anst) { Anställd a; a = typ; personansökan.Anställd = typ; foreach (var item in försäkringstagare) { PFörsäkringstagare pf; pf = item; personansökan.PFörsäkringstagare = pf; } } db.PersonAnsökanSet.Add(personansökan); db.SaveChanges(); } }

När vi försöker spara en personansökan får vi fel på db.SaveChanges som felar på pförsäkringstagare. Hittar inte varför. Har problem med mappning i min dator så kan inte testköra och kopiera in det exakta felmeddelandet, men felet hamnar på pförsäkringstagare. Förstår inte hur det kan bli så, är det någon som ser något direkt i vår kod?
Har som sagt använt "samma" kod tidigare och har funkat då.

med code-taggar
Här är felmeddelandet (inner exception): : {"The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_PFörsäkringstagarePersonAnsökan\". The conflict occurred in database \"suht1804\", table \"dbo.PFörsäkringstagareSet\", column 'PFörsäkringstarId'.\r\nThe statement has been terminated."}

Permalänk
Medlem

Utifrån felmeddelandet har ni, om jag inte är helt ute och cyklar, fel med eran SQL-query i tabellen dbo.PFörsäkringstagareSet och kolumn PFörsäkringstarId.
Hur ser SQL-koden för relationen ut?

Ett litet tips också. Ha som vana att alltid skriva programkod på engelska Då det är det som kommer krävas senare i livet om ni vill programmera. Sedan ser det snyggare ut också

Visa signatur