Inlägg

Inlägg som lovarn har skrivit i forumet
Av lovarn

C:\Users\gusta\Desktop\modell.jpg kopiera denna länken och lägg i sökfältet, jag lyckas inte infoga den på något annat sätt.
Försäkringstyp och personansökan är kopplade CIA foreign key till försäkring och dem sparas precis som dem ska.
Problemet är försäkringgrundbelopp och övriga som inte har det. Då har jag gått genom försäkringstyp för att spara ett objekt av grundbelopp men jag vet inte om det funkar. För den koden jag fick ovan i tidigare inlägg letar upp en försäkrings grundbelopp men jag fick då inte det värdet jag önskar.
Så min fråga är hur jag ”kopplar” ett objekt med ett annat objekt som inte har foreign keys kopplade utan går via en annan entitet.
Såhär försökte jag skriva i koden ovan:

personförsäkring.Försäkringstyp.Försäkringgrundbelopp.ToList()[] = g;

G i detta faller motsvarar ju ID för försäkringgrundbelopp. Jag har gått igenom och satt stopp för att se och rätt värde kommer ner hit och verkar sparas men sen när jag kör den första kod delen(längre upp i tråden) där jag letar upp värdet så fick jag inte rätt värde ändå. Så jag är osäker på om det verkligen sparas eller vart felet hamnar..

Skickades från m.sweclockers.com

Av lovarn

Tack!! Jag fick fram ett värde på det sättet men tyvärr inte det värdet jag önskade, men ni verkar ha bra koll så ni kanske kan hjälpa mig med hur jag ska spara rätt objekt kopplat till försäkringen. Jag printscreenar en bild av min modell då vi kör EF model first, och sen hur jag skrivit koden för att ni ska förstå vad jag försöker göra så kanske ni vet varför det inte verkar fungera.
C:\Users\gusta\Desktop\modell.jpg

Använder winform så jag har kopplat en listbox till entiteten försäkringgrundbelopp, jag har kontrollerat och vet att den väljer rätt värde. När jag sedan försöker spara så vet jag inte om det fungerar.. som ni ser är det fler objekt jag försöker koppla(tillval och tillvalgrundbelopp) men får jag det att funka för försäkringgrundbelopp bör det ju gå att göra samma med de andra tänker jag.. såhär har jag gjort för att försöka koppla det försäkringgrunbeloppet jag valt till den nya försäkringen jag försöker skapa:

public void LäggtillPersonförsäkring(string LöpNr, string FörsäkNr, string Premie, DateTime AnkomstDatum, string Betalform, DateTime Förfalldag, int Betalningsår, int Betalningsmånad, int försäktyp, double eventuellprov, int Grundbelopp, string Till, int Grundtillval, int PersAnsId, int Pförsäktag) { using (var db = new Model1Container()) { //skapar en ny personförsäkring PersonFörsäkring personförsäkring = new PersonFörsäkring() { Löpnr = LöpNr, Försäkringsnr = FörsäkNr, Premie = Premie, Ankomstdatum = AnkomstDatum, Betalform = Betalform, Förfallodag = Förfalldag, Betalningsmånad = Betalningsmånad, Betalningsår = Betalningsår, EventuellProvision = eventuellprov }; //hämtar försäkringstyp var försäkty = from typ in db.FörsäkringstypSet where typ.FörsäkringstypID == försäktyp select typ; //och sparar den för försäkringen foreach (var B in försäkty) { Försäkringstyp ftyp; ftyp = B; personförsäkring.Försäkringstyp = B; } //hämtar ansökan var persansökan = from item in db.PersonAnsökanSet where item.PersAnsID == PersAnsId select item; //och sparar den för försäkringen foreach (var item in persansökan) { PersonAnsökan p; p = item; personförsäkring.PersonAnsökan = item; } //hämtar grundbelopp(försäkringstyp) var grundbelopp = from g in db.FörsäkringGrundbeloppSet join r in db.FörsäkringstypSet on g.FörsäkringstypFörsäkringstypID equals r.FörsäkringstypID where g.FörsäkringGrundID == Grundbelopp select g; //sparar den för försäkringen foreach (var g in grundbelopp) { FörsäkringGrundbelopp grund; grund = g; personförsäkring.Försäkringstyp.FörsäkringGrundbelopp.ToList()[0] = g; } //hämtar tillval var tillval = from t in db.TillvalSet where t.Tillvalstyp == Till select t; //och sparar den för försäkringen foreach (var t in tillval) { Tillval x; x = t; personförsäkring.Försäkringstyp.Tillval.ToList()[0] = t; } //hämtar grundbelopp för tillvalet var grundbelopptillval = from y in db.TillvalGrundbeloppSet where y.TillvalgrundID == Grundtillval select y; //och sparar den foreach (var y in grundbelopptillval) { TillvalGrundbelopp u; u = y; personförsäkring.Försäkringstyp.Tillval.ToList()[0].TillvalGrundbelopp.ToList()[0] = y; } //lägger till den nya försäkringen till databasen //och sparar den db.PersonFörsäkringSet.Add(personförsäkring); db.SaveChanges(); } }

Av lovarn

LINQ

Hej!

Jag försöker hämta ett attribut(grundbelopp) för en specifik försäkring. Dessa är kopplade genom försäkringstyp som ni ser. Jag är inte säker på att något grundbelopp sparats för försäkringen än men det är på detta sättet jag behöver kunna hitta det i så fall, men jag får följande felmeddelande: LINQ to Entities does not recognize the method 'Datalager.FörsäkringGrundbelopp get_Item(Int32)' method, and this method cannot be translated into a store expression.

Försöker returnera grunbeloppet som en double då det är den datatypen den har.

Såhär ser koden ut:

public double HämtaGrundbeloppPersonförsäkring(int i) { using (var db = new Model1Container()) { var query = (from x in db.PersonFörsäkringSet //join typ in db.FörsäkringstypSet on x.FörsäkringstypFörsäkringstypID equals typ.FörsäkringstypID //join försäk in db.PersonFörsäkringSet on typ.FörsäkringstypID equals försäk.FörsäkringstypFörsäkringstypID where x.PFörsäkringID == i select x.Försäkringstyp.FörsäkringGrundbelopp.ToList()[0].Grundbelopp); return query.FirstOrDefault(); } }

Av lovarn

LINQ hämta från flera tabeller till en lista

Hej!
Jag lyckas inte returnera tillbaka till en lista, problemet är att jag inte vet vad listan blir för datatyp. Som ni ser hämtar jag från tre olika tabeller; PersonAnsökan, PFörsäkringstagare och Anställd. Hur ska jag göra för att returnera tillbaka listan.

public List<PersonAnsökan> VisaAllaAnsökningar() { List<PersonAnsökan> personansökan = new List<PersonAnsökan>(); using (var db = new Model1Container()) { var query = (from x in db.PersonAnsökanSet from y in db.PFörsäkringstagareSet from a in db.AnställdSet where y.PersonAnsökan == x.PFörsäkringstagare where a.PersonAnsökan == x.Anställd select new { x.FörsäkradFnamn, x.FörsäkradEnamn, x.FörsäkradPersNr, x.Försäkringsbolag, x.PersAnsID, y.FNamn, y.ENamn, y.PersNr, y.Postadress, y.Gatuadress, y.PostNr, y.TelnrArbete, y.TelnrBostad, y.Email, y.PFörsäkringstarId, a.AgenturNr, a.Anstnr, a.Fnamn }).ToList(); return query.ToList(); } }

Av lovarn
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."}

Av lovarn
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

Av lovarn

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å.