Database for udviklere Jan Lund Madsen PBS10107
Indhold LINQ... 3 LINQ to SQL og Arkitektur... 3 O/R designere... 5
LINQ Den store introduktion med.net 3.5 er uden tvivl LINQ(udtales link): Language-INtegrated Query eller bare LINQ. Skåret helt til benet er LINQ blot en SQL-lignende syntaks til forespørgsler på typer, der understøtter IEnumerable<T> 1. IEmunarable<T> specificerer reelt kun en metode, nemlig GetEnumerator(). GetEmunerator() returnerer en instans af en type, der implementerer IEnumerator<T>. Det lyder måske ikke af det vilde på overfladen, men når man tænker på hvor mange typer, der understøtter IEnumerable<T> samt taget i betragtning, at egne typer naturligvis også kan implementere dette interface, begynder det at blive yderst interessant. I praksis betyder det, at vi fx kan anvende LINQ mod collections, XML og naturligvis relationelle data 2 hvis de dog er mappet til et objekt(er). Altså er LINQ en teknologi til noget med at skrive forespørgelser eller søgninger/filtering osv. direkte som en del af programmeringssprogets syntaks. Her kan vi se vejen fra fx Csharp til LINQ til data og de forskellige features der tilbydes. LINQ TO SQL OG ARKITEKTUR LINQ to SQL er et eksempel på en ORM: Object-Relational Mapping. Når man arbejder med objekt orienteret programmering og relationelle databaser, sidder programmører ofte med problemstillingen om hvordan objekter i programmeringssproget skal repræsenteres ved rækker og relationer i databasen. For selv om der er en hel del ligheder, så er der også en del væsentlige forskelle imellem OOP verdenen og den Relationelle verden 3. En ORM er en teknologi som forsøger at slå bro imellem de to verdener. LINQ i sig selv er dog ikke ORM - LINQ som navnet (Language INtegrated Query) antyder er et sprog til at skrive querys imod en eller anden form for datastore. LINQ to SQL udgør imidlertid hvad vi vil kalde ORM s, da de netop 1 FirstPress LINQ for Visual C# 2008 af Fabio Claudio Ferracchaiti side 9 2 http://msdn.microsoft.com/da-dk/library/bb308959(en-us).aspx 3 http://en.wikipedia.org/wiki/object-oriented_programming
håndterer mapning og persistering af data i databaser. Det fungerer ved at man designer en mapningsstruktur 4. LINQ to SQL s O/R designer er et super nemt og stærkt værktøj i visual studio til at mappe sine rationelle data tabeller til objekter. Det kan dog også sagtens lade sig gøre at lave den mapping uden O/R designeren. Derved kan programmøren få indblik i hvad der skal til og selv kontrollere koden. LINQ to SQL baserer sig på at man opretter og mapper en klasse for hver tabel man er interesseret i. Klassen dekoreres med en [Table] attribut og de enkelte felter med en [Column]. IsPrimaryKey = true indikerer at det er primær nøglen i tabellen. Det er faktisk alt hvad der skal til for at mappe. Der ligger dog meget mere i det end som så. Selvfølgelig ville man lave privat attributter og Get og Set metoder in real life. Derefter kan vi benytte LINQ sprogets faciliteter. Vi skal dog lige oprette en forbindelse mellem tabellen og databasen. Dette håndteres via DataContext-klassen 5, og denne er så at sige hjertet i LINQ to SQL. Nu kan vi oprette forbindelse mellem Nyheds objektet og nyheds tabellen. 4 http://en.wikipedia.org/wiki/language_integrated_query 5 FirstPress LINQ for Visual C# 2008 af Fabio Claudio Ferracchaiti side 97
Her ses hvordan en LINQ query bliver transformeret til SQL query. O/R DESIGNERE Man kunne sagtens have lavet denne mapning manuelt med alle de tabeller og views der skulle bruge. Men der findes allerede et super stærkt værktøj i VS til dette og når man skal mappe views eller tabeller bliver denne process en hel del nemmere ved at lade O/R designeren generer klassen for en. I VS gør vi som vi plejer når vi vil lave et nyt Item. Højre klik på solution og Add New item. Så kan man se der er kommet nye muligheder med.net 3.5 i forhold til 2.0 her benytter vi os LINQ to SQL Classes og giver denne et passende navn. Hvis vi holder fast i en nyhed for at vise forskelle og ligheder mellem manuel mapning og O/R designerens mapning, er det Nyheder.dbml vi tager fat i. Derefter skal vi lave en data connection vha. server explorer. Trykker add connection, derefter skriver vi server navn osv. ind og finder vores database hvor vi kan navigere ned til tabellerne, view osv. Så trækker vi skam bare Nyheds tabellen ind i det hvide felt. Så generer VS entitet-klassen og vi kan se en grafisk repræsentation af den: Så er man klar til at benytte LINQ sprogets faciliteter. Denne gang vha. O/R designeren i VS.
O/R designeren har lavet det for os. Og vi slipper for behov for connectionstring, da det også bliver generet for os. Så nu er det tiden til at dykke ned i det som den generer. Det er to filer, et layout som er den grafiske repræsentation og en designer cs som er koden. Læg mærke til det lille s i Nyheds. Det skyldes simpelthen at værktøjet er Microsoft og at det forsøger at sætte amerikansk flertals s på navnet. I Nyheder.designer.cs kan vi se her hvordan vi får forbindelse til databasen, den er defineret i app.config filen. I Nyheder.designer.cs kan vi også se her hvorfor vi slipper for context.gettable, det er lavet for os her. Og der kommer flertals s et også ind i billedet. Ellers er det meget lig med hvad vi er vant til. Private attributter. Her er det værd at bemærke vi ikke skal type bestemme dem. Det gør O/R designeren for os.
Så kommer GET og SET metoder, hvor man også kan sætte en masse ting primærnøgle, hvilken type osv. Selvom man er typen der gerne vil skrive ens entitets klasse selv kan det faktisk være meget lærerigt at benytte O/R designerens funktion og derved kigge koden igennem for inspriration. Dette virker dog kun til MSSQL. Men hvis man vil benytte denne funktion er der allerede lavet DLL er til dette. ALinq.org har udgivet en provider der virker til Access, MySQL, POSTgreSQL osv. Alternativt, vil man kunne gøre brug af LINQ to Entities, der binder LINQ sammen med ADO.NET.