Avatar billede noxiaz Nybegynder
15. oktober 2010 - 12:00 Der er 4 kommentarer og
1 løsning

Linq to SQL

Hej,

Jeg står med et kæmpe problem lige pt. da jeg ikke kan få linq til at query databasen hvergang jeg laver .Count()
Nedenstående kode er den jeg bruger.

      public void start()
        {
            DB.Log = Console.Out;           
            int installationnumber = 1;

            //Virker
            var OLDinst = (from Oline in DB.Installations where Oline.installation_number == installationnumber select Oline).First();
            int OLDantal = OLDinst.Ports.Count();

            Table<Port> Ports = DB.GetTable<Port>();
           
            Port port = new Port();
            port.blades_id = 7;
            port.portnumber = 1;
            port.installations_id = OLDinst.id;
            port.state = 1;

            Ports.InsertOnSubmit(port);
            DB.SubmitChanges(ConflictMode.FailOnFirstConflict);           

            //Virker ikke
            Installation NEWinst = (from line in DB.Installations where line.installation_number == installationnumber select line).First();           
            int NEWantal = NEWinst.Ports.Count();

            //Virker
            int InstPort = (from line in DB.Ports where line.Installation == NEWinst select line).Count();

            Console.WriteLine("Old: " + OLDantal);
            Console.WriteLine("New: " + NEWantal);
            Console.WriteLine("Real Port Count: " + InstPort);
        }   

Min database består af 3 Tabels: Installation,Ports,Blades som er linket på følgende måde via foreign key:
Installation -> Ports <- Blades

For at give lidt forklaring har jeg en installation som jeg vil tildele en port til. Hvilket også funger perfekt. Men når jeg så vil lave mit check i koden for at være sikker på det virker, ved at lave: "int NEWantal = NEWinst.Ports.Count();" sender den ikke nogen query mod tablen Ports i databasen, den tager bare det den kan huske fra tidligere, hvilket jo er forkert for jeg har lige lavet "SubmitChanges".
Hvis jeg så laver "int InstPort = (from line in DB.Ports where line.Installation == NEWinst select line).Count();" Så får jeg det rigtige antal.

Output bliver:
Old: 0
New: 0
Real Port Count: 1
Avatar billede Syska Mester
15. oktober 2010 - 12:37 #1
Det er pga Cache i din linq2sql context.

Derfor kommer den nye ikke med.

Tror det kan løses hvis du i stedet for at sætte din PK ID ... sætter den sådan her:

var port = new Port();
port.Installation = installation; // ergo du skal bruge reference og ikke dit id, så brude det måske virke.

Håber det giver mening.

mvh
Avatar billede Syska Mester
15. oktober 2010 - 12:38 #2
Lidt mere information ...

Port burde have:
port.Blade
port.Installation

Men der er selvfølgelig også port.BladeId ... men det er jo et nummer, og ikke den direkte reference, og derfor det nok fejler.
Avatar billede noxiaz Nybegynder
15. oktober 2010 - 13:24 #3
Buzzzz, det virkede at lave reference til Installation istedet for installationid .. Det skal man vidst lige være opmærksom på, at det er den måde man skal indsæt ting i databasen.
Er rimelig ny til det her med lin2sql =)

Er der nogen måde på man kan disable den lokale cache? - Synes ikke lige google kommer med nogen forslag.
Avatar billede Syska Mester
15. oktober 2010 - 14:04 #4
ObjectTracking på din context ...

Men så er den readonly, og Insert virker "vist nok" ikke ...

Ja, den er lidt speciel :-) Jeg løb også ind i dette problem da jeg startede med linq2sql.

mvh
Avatar billede Syska Mester
15. oktober 2010 - 14:05 #5
og svar.
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