Avatar billede dennism Nybegynder
28. maj 2009 - 20:37 Der er 9 kommentarer og
1 løsning

WCF: Problem med LINQ objekter

Jeg har en database-struktur, som i LINQ ser ud som følger:
http://www.dennismadsen.com/wp-content/uploads/2009/05/image41.png

Med en ASP.NET WS har jeg tidligere distribueret en metode kaldet "GetTanks", som giver en liste af alle tanks i databasen. For hver Tank medfølger også dens relationer (Tank<->Sensor).

Det betyder at jeg på klienten kan køre kode som denne:
    foreach (Tank tank in tanks) {
        Console.WriteLine(tank.Name);
        foreach (Sensor sensor in tank.Sensors) {
            Console.WriteLine("  "+sensor.Id);
        }
    }

Jeg har nu forsøgt at gøre det samme med en WCF service, som også ligger som en service på en IIS. Her lader det dog til, at min WCF-binding er sat forkert op, da jeg får en nullPointerException på tank.Sensors i den inderste for-løkke på klienten. Altså er listen af Sensors for hver tank lig null.

Nogen der kan give et godt bud på, hvad dette kan skyldes?

På forhånd tak!
Avatar billede sirius Nybegynder
28. maj 2009 - 20:52 #1
Er vel fordi din Sensor relation ikke er loaded fra databasen og derfor null.

Normalt med LINQ to SQL vil denne blive lazyloadet, men det kan nok ikke lade sig gøre over en WCF service. Derfor skal du manuelt sørge for at relationen er loaded på din server inden du sender den til klienten.

foreach (Tank tank in tanks)
{
    tank.Sensors.Load();
}
Avatar billede dennism Nybegynder
28. maj 2009 - 20:59 #2
Der findes ikke en Load-metode på tank.Sensors. Er det noget der skal slåes til på server-siden?
Avatar billede sirius Nybegynder
28. maj 2009 - 21:05 #3
hvilken type er tank.Sensors ?
Avatar billede dennism Nybegynder
28. maj 2009 - 21:11 #4
Sensors er en klasse LINQ to SQL har skabt udfra min tabeller. Jeg går ud fra, at Sensors er en property af typen List<Sensors> som ligger i hver Tank?
Avatar billede sirius Nybegynder
28. maj 2009 - 21:28 #5
jeg ville jo gætte på at tank.Sensors er af typen EntitySet<Sensor> og så burde den have en metode der hedder Load.

Er lidt svært at sige hvad problemet er uden at se koden.
Avatar billede dennism Nybegynder
28. maj 2009 - 22:02 #6
Jeg har kigget lidt i den kode LINQ to SQL har genereret. Der står:

    public partial class Tank : INotifyPropertyChanging, INotifyPropertyChanged
    {
       
        private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
       
        private int _Id;
       
        private string _Name;
       
        private string _PhysicalAddress;
       
        private EntitySet<Sensor> _Sensors;

Gør jeg noget forkert, siden jeg ikke kan køre en Load på mine objekter på klient siden?
Avatar billede sirius Nybegynder
28. maj 2009 - 22:53 #7
nej, det er klart at du ikke kan køre load på klient siden.
Klienten har jo ikke nogen chance for at vide hvordan den skal loade sensors.

Du skal udføre din load på serveren når klienten forespørger på data
Avatar billede dennism Nybegynder
29. maj 2009 - 15:43 #8
Der er heller ingen Load-methode på server-side.
Avatar billede dennism Nybegynder
30. maj 2009 - 13:14 #9
Vil du smide et svar? Jeg manglede en reference til System.Data.LINQ på min WCF Service, hvilket gjorde at Load-metoden ikke eksisterede.

Tak for hjælpen!
Avatar billede sirius Nybegynder
31. maj 2009 - 22:44 #10
var så lidt :)
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
Kurser inden for grundlæggende programmering

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