Documente Academic
Documente Profesional
Documente Cultură
Cea mai bună modalitate de a scrie interogări utilizând LINQ în SQL este de a avea o clasă
derivată din DataContext în codul dvs. care expune toate tabelele, procedurile stocate și funcțiile
definite de utilizator de care aveți nevoie ca proprietăți ale unei instanțe de clasă. De asemenea, aveți
nevoie de clase entitate mapate la obiectele bazei de date. După cum ați văzut în capitolele anterioare,
puteți crea această mapare utilizând atribute pentru a decora clasele sau printr-un fișier extern de
mapare XML. Cu toate acestea, scrierea manuală a informațiilor despre cartografiere este atât de
dificilă, cât și de greșită; din fericire, există câteva instrumente care vă pot ajuta să realizați această
sarcină.
Acest capitol acoperă tipurile de fișiere implicate în maparea claselor de entități la obiectele
bazei de date și instrumentele disponibile pentru a genera automat aceste informații.
Tipuri de fișiere
Există trei tipuri de fișiere implicate în crearea entităților LINQ către entități SQL și definirea lor de
mapare:
O greșeală obișnuită este confundarea fișierelor XML și DBML. La prima vedere, aceste două fișiere sunt
similare, dar ele sunt foarte diferite atât în utilizare, cât și în procesul de generare.
Puteți genera automat fișierul DBML extragând metadate dintr-o bază de date Microsoft SQL
Server existentă. Cu toate acestea, fișierul DBML include mai multe informații decât pot fi deduse din
tabelele bazei de date. De exemplu, setările pentru sincronizare și încărcare întârziată sunt specifice
utilizării intenționate a entității. Mai mult, fișierele DBML includ informații care sunt utilizate numai de
către generatorul de coduri care generează codul sursă Microsoft Visual Basic sau C #, cum ar fi clasa de
bază și spațiul de nume pentru clasele de entități generate.
Fișierul DBML este cel mai bogat container de informații despre metadate pentru LINQ către
SQL. De obicei, acesta poate fi generat dintr-o bază de date SQL Server și apoi modificat manual,
adăugând informații care nu pot fi deduse din baza de date. Aceasta ar fi abordarea tipică atunci când se
utilizează instrumentul de comandă SQLMetal. Designerul O / R oferă o modalitate mai dinamică de
editare a acestui fișier, deoarece puteți importa entități dintr-o bază de date și le puteți modifica direct
în fișierul DBML printr-un editor grafic. De asemenea, puteți utiliza Designerul O / R pentru a edita
fișierul DBML generat de SQLMetal. Fișierul DBML poate fi utilizat pentru a genera codul sursă C # sau
Visual Basic pentru entități și clase derivate din DataContext. Opțional, poate fi folosit și pentru a genera
un fișier extern de mapare XML.
Acest cod sursă pentru definirea LINQ pentru clasele de entități SQL poate fi generat automat de
instrumente cum ar fi SQLMetal direct dintr-o bază de date SQL Server. Funcția de generare de cod
SQLMetal poate, de asemenea, să traducă un fișier DBML în codul sursă C # sau Visual Basic. Când
solicitați SQLMetal să genereze cod sursă entitate, pe plan intern generează un fișier DBML care este
apoi convertit în codul sursă al entității.
Dacă aveți o bază de date relațională, puteți genera un fișier DBML care descrie tabele, vederi,
proceduri stocate și funcții definite de utilizator (UDF), mapându-le la entități de clasă care pot fi create
de generator de cod. După generarea fișierului DBML, îl puteți edita cu orice editor de text sau cu
designerul O / R.
Puteți alege să generați cod sursă pentru entități de clasă în C # sau Visual Basic cu mapare
bazata pe atribute. Acest cod poate fi generat dintr-un fișier DBML sau direct dintr-o bază de date SQL
Server.
Dacă porniți de la un fișier DBML, puteți modifica acest fișier DBML și apoi puteți regenera codul
sursă. În acest caz, nu trebuie să modificați codul sursă generat, deoarece ar putea fi suprascris în
ciclurile viitoare de regenerare a codului. În schimb, dacă trebuie să modificați sursa generată pentru a
personaliza clasele generate, ar trebui să utilizați un fișier de cod sursă separat, utilizând declarația de
clasă parțială a entităților de clasă generate. Acesta este modelul pe care îl utilizați atunci când lucrați cu
designerul O / R.
Pe de altă parte, dacă generați cod direct dintr-o bază de date SQL Server, puteți personaliza în
continuare fișierul cu cod sursă utilizând clase parțiale; cu toate acestea, dacă trebuie să modificați
setările de mapare, va trebui să modificați codul sursă generat. În acest caz, probabil că niciodată nu veți
regenera acest fișier și, prin urmare, puteți modifica direct sursa generată.
Generarea unui cod sursă al unei entități cu un fișier extern de mapare XML
În cele din urmă, puteți alege să generați cod sursă pentru entitățile de clasă din C # sau Visual
Basic împreună cu un fișier extern de mapare XML. Codul sursă și fișierul de mapare XML pot fi generate
atât dintr-un fișier DBML, fie direct dintr-o bază de date SQL Server.
Dacă porniți de la un fișier DBML, puteți modifica în continuare fișierul DBML și apoi puteți
regenera codul sursă și fișierul de mapare. Din nou, în acest caz, nu doriți să modificați direct fișierele
generate; utilizați în schimb clase parțiale. Acesta este modelul utilizat atunci când lucrați cu designerul
O / R.
În mod similar, dacă generați cod direct dintr-o bază de date SQL Server, ar trebui să
personalizați și codul sursă rezultat folosind clase parțiale. Deoarece informațiile de cartografiere sunt
stocate într-un fișier XML separat, va trebui să modificați acel fișier pentru a personaliza setările de
cartografiere. Cel mai probabil, niciodată nu veți regenera aceste fișiere și, prin urmare, puteți efectua
modificări direct la fișierele generate.
În final, puteți scrie un fișier DBML de la zero. În acest caz, probabil că nu veți avea un fișier de
bază de date existent; în schimb, ați genera probabil baza de date din fișierul DBML apelând metoda
DataContext.CreateDatabase pe o instanță a clasei generate moștenită de la DataContext. Această
abordare este teoretic posibilă atunci când scrieți personal fișierul XML, dar, în practică, este mult mai
probabil să se facă folosind Designerul O / R.
SQLMetal
SQLMetal este un instrument de generare a codului de comandă pe care îl puteți utiliza pentru a:
- Genera codul sursă al unei entități (și, opțional, un fișier de mapare) dintr-o bază de date.
-Genera codul sursă al entității (și, opțional, un fișier de mapare) dintr-un fișier DBML.
Sintaxa de comandă pentru SQLMetal este simplă: sqlmetal [options] [<input file>]
Autentificarea Windows este utilizată în mod implicit. Dacă doriți să utilizați autentificarea SQL
Server, puteți utiliza opțiunile /user și /password. Alternativ, puteți utiliza opțiunea /conn (conexiune),
care are un șir de conexiune, dar nu poate fi utilizat cu /server, /database, /user sau /password.
Următoarea linie de comandă care utilizează /conn este echivalentă cu exemplul anterior, care a folosit /
server și /database:
sqlmetal /conn:"Server=localhost;Database=Northwind;Integrated Security=yes" /dbml:northwind.
dbml
Dacă aveți fișierul Northwind .mdf din directorul curent și utilizați Microsoft SQL Server Express,
puteți obține același rezultat folosind următoarea linie care utilizează parametrul fișierului de intrare:
În mod similar, puteți specifica un fișier .sdf (extensia pentru fișierele SQL Server Compact 3.5)
În mod implicit, procesul de generare extrage numai tabele dintr-o bază de date, dar, de
asemenea, puteți extrage vederi, funcții definite de utilizator și proceduri stocate utilizând /views,
/functions și /sprocs, după cum se arată aici:
sqlmetal /server:localhost /database:Northwind /views /functions /sprocs /dbml:northwind.dbml
De exemplu, următoarea linie generează codul sursă C # pentru entități extrase din baza de date
Northwind: sqlmetal /server:localhost /database:Northwind /code:Northwind.cs
Dacă doriți toate tabelele și vederile in Visual Basic, puteți utiliza următoarea linie de comandă:
Opțional, puteți adăuga generarea unui fișier de mapare XML utilizând opțiunea /map, ca în
următoarea linie de comandă: sqlmetal /server:localhost /database:Northwind /code:Northwind.cs
/map:Northwind.xml
/namespace Controlează spațiul de nume al codului generat. (În mod implicit, nu există niciun
spațiu de nume.)
/context Specifică numele clasei moștenite de la DataContext care va fi generată. (În mod
implicit, este derivat din numele bazei de date.)
/entitybase Permite definirea clasei de bază a claselor de entități generate. (În mod implicit, nu
există o clasă de bază.) De exemplu, următoarea linie de comandă generează toate entitățile dintr-un
spațiu de nume LinqBook, derivându-le din clasa de bază DevLeap.LinqBase: