Avatar billede lasserasch Juniormester
28. marts 2012 - 09:31 Der er 5 kommentarer og
1 løsning

Entity Framework - Gemme objekter i SQL Database

Hejsa.

Jeg er ved at sætte mig ind i Entity Frameworket. Jeg har lige et lille spørgsmål. Sikkert en simpel ting....

Jeg har 2 tabeller.

1. User
2. Address

I databasen har jeg lavet en realtion mellem User tabellen og address. Dvs alle records i user tabellen har en reference til en address record i address tabellen.

Hvis jeg bare skal gemme en address record, så virker alt fint.
Men så snart jeg skal gemme en user record i databasen får jeg en fejl, som jeg ikke kan finde en løsning på :-(

Håber en kan hjælpe.

Jeg får følgende fejl :

"The EntityKey property can only be set when the current value of the property is null."


EntityKey for begge objekter er 'ID' feltet. Som er af typen Guid.

Her er mit kode eksempel :

private void CreateUser()
        {
            DataService.User u = new DataService.User();
            Address Address = new DataService.Address();
            u.Email = tbemail.Text;
            u.FirstName = tbfirstname.Text;
            u.HomePhone = tbhomephone.Text;
            u.IsFaceBookUser = false;
            u.LastName = tblastname.Text;
            u.Mobile = tbmobile.Text;
            u.Password = tbpassword.Text;
            Address.City = tbcity.Text;
            Address.Country = tbcountry.Text;
            Address.Floor = tbfloor.Text;
            Address.HouseNumber = tbhousenumber.Text;
            Address.Region = tbregion.Text;
            Address.Street = tbstreet.Text;
            Address.Zip = tbzip.Text;
            u.Userstatus = DataService.Userstatus.Created;

            Address.ID = Guid.NewGuid();
            u.ID = Guid.NewGuid();
            using (var dc = new DataContext())
            {
                dc.Address.AddObject(Address);
                dc.User.AddObject(u);
                dc.SaveChanges();
            }
        }

Og som sagt. Hvis jeg udkommenterer 'dc.User.AddObject(u);' så virker resten fint.


Mvh.
Lasse
Avatar billede lasserasch Juniormester
28. marts 2012 - 09:34 #1
Og hvis jeg retter koden til som herunder, så får jeg samme fejl, men nu bare en linie tidligere. Nemlig på dc.Address.AddObject(Addresse);


.....
u.Userstatus = DataService.Userstatus.Created;

            Address.ID = Guid.NewGuid();
            u.ID = Guid.NewGuid();
            u.Address = Address;
            using (var dc = new DataContext())
            {
                dc.Address.AddObject(Address);
                dc.User.AddObject(u);
                dc.SaveChanges();
            }
....
Avatar billede Syska Mester
28. marts 2012 - 09:48 #2
Den ene burde gemme den anden hvis de har en reference.

Men er det en 1:1 relation du har? ( virker det til, og dem har jeg ikke leget så meget med )
Avatar billede lasserasch Juniormester
28. marts 2012 - 09:56 #3
Beklager drenge.... Det var en fejl 40 :-(

Fejlen lå i den Userstatus (et objekt) jeg også satte på en user.

Den trak jeg nemlig ud fra databasen, og det skete jo så i en anden context, hvorfor den selvfølgelig ikke kunne tilføjes til den nye context.

Det må vist være en EF begynder fejl :-)

Her er den kode jeg brugte til at sætte userstatus og som var synderen.

Den er nu lavet om, så den tager Datacontext med som parameter og ikke laver sin egen.

public static Userstatus Created
        {
            get
            {
                Guid status = Guid.Parse(Constants.IDs.UserStatusCreated);
                using (var dc = new DataContext())
                {
                  return dc.Userstatus.FirstOrDefault(a => a.ID == status);
                }
            }
        }


Mvh.
LAsse
Avatar billede Syska Mester
28. marts 2012 - 10:05 #4
:-) *heheh*

Men hvad version bruger du?

EF 4.3 er jo ude ... som har CodeFirst ... og andre ting i forhold til den version du lader til at bruge.

Jeg er dog ikke helt sikker på  hvad tooling der er med til EF 4.3, men den kan klart anbefales.

mvh
Avatar billede lasserasch Juniormester
28. marts 2012 - 11:11 #5
Ja, jeg læste deres blog indlæg på msdn for noget tid siden omkring 4.3 :-)

Det er dog ver. 4.0 jeg bruger. (Mest fordi jeg ikke lige har fået hentet den nye pakke endnu).

Men der er en ting som jeg håber bliver bedre i nye versioner. Måske det allerede er rettet i 4.3??

Den kan ikke håndtere at man bruger SQL funktionen newid() til ID kolloner som bruger Guid Datatype. (Unique idendifier).

Jeg bruger næsten altid Guid som ID'er i mine tabeller.

Hvis man ikke sætter ID = Guid.NewGuid() inden man gemmer, så skriver den '0000-00000.....' i databasen. Det synes jeg sgu er ret irriterende.

Men håber det bliver rettet.

Nå, men jeg lukke tråden igen :-)
Avatar billede Syska Mester
28. marts 2012 - 11:28 #6
De har forskellige måder at håndtere mapningen af autogenerated key, og det er helt sikkert fixed.

5.0 får support for Enums ... YAH.

Men ... i forhold til 4 ... eller hvad version du nu bruger, så er der sket en del. Den version du bruger kom vist med VS 2010 ... og nu findes EF vist kun som en NuGet pakke.

Men ... jeg synes i hvert fald godt om EF :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Netcompany A/S

Software Developer

De Nationale Geologiske Undersøgelser for Danmark og Grønland (GEUS)

IT-systemadministrator søges til GEUS