Sunteți pe pagina 1din 6

Capitolul 7

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:

-Limbaj de marcare a bazei de date (DBML)

- Codul sursă (C # sau Visual Basic)

-Fișierul extern de cartografiere (XML)

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.

Limbajul de marcare a bazei de date DBML


Fișierul DBML conține o descriere a entităților LINQ către SQL într-un limbaj de marcare a bazei
de date. Visual Studio instalează un fișier DbmlSchema.xsd, care conține definiția schemei respectivei
limbi și poate fi folosit pentru a valida un fișier DBML. Spațiul de nume folosit pentru acest fișier este
http://schemas.microsoft.com/linqtosql/dbml/2007 (care este diferit de spațiul de nume utilizat de XSD
pentru fișierul extern de cartografiere XML).

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.

C # și codul sursă Visual Basic


Definiția LINQ la entitățile SQL poate fi localizată în codul sursă în C #, Visual Basic sau în orice
alt limbaj .NET Framework. Acest cod de definiție poate fi decorat cu atribute care definesc maparea
entităților și a proprietăților lor la tabelele bazei de date și coloanele lor. Alternativ, puteți defini
cartografia utilizând un fișier extern de mapare XML. Cu toate acestea, nu puteți combina cele două -
trebuie să alegeți doar un singur loc pentru a defini mapările entității. Dacă utilizați ambele, fișierul
extern de mapare XML are prioritate față de atributele definite pentru entitățile de clasă.

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.

Fișier extern de cartografiere XML


Un fișier extern de cartografiere poate conține metadate obligatorii pentru LINQ către entități
SQL ca alternativă la stocarea acestora în atributele de cod. Acest fișier este XML cu o schemă care este
un subset al fișierului DBML. Fișierul DBML conține, de asemenea, informații utile pentru generatoarele
de coduri. Rețineți că atributele definite pe entitățile de clasă sunt ignorate ori de câte ori acestea sunt
incluse în definițiile unui fișier extern de cartografiere.

Spațiul de nume utilizat pentru acest fișier este


http://schemas.microsoft.com/linqtosql/mapping/2007, care este diferit de cel folosit de fișierul DBML
XSD.

Linq la generarea de fișiere SQL


De obicei, veți folosi un instrument pentru a genera majoritatea fișierelor utilizate în LINQ la
SQL. Diagrama din Figura 7-1 ilustrează relațiile dintre diferitele tipuri de fișiere și baza de date
relațională.
Generarea unui fișier DBML dintr-o bază de date existentă

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.

Generarea unui cod sursă al unei entități cu cartografierea pe baza de atribute

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.

Crearea unui fișier DBML de la zero

Î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 un fișier DBML dintr-o bază de date.

- 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>]

Generarea unui fișier DBML dintr-o bază de date


Pentru a genera un fișier DBML cu SQLMetal, trebuie să specificați opțiunea / dbml, urmată de
numele fișierului pe care doriți să-l creați. Sintaxa pentru a specifica ce bază de date să utilizeze depinde
de tipul bazei de date. De exemplu, puteți specifica o bază de date standard SQL Server cu /server și
/database: sqlmetal /server:localhost /database:Northwind /dbml:northwind.dbml

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:

sqlmetal /dbml:northwind.dbml Northwnd.mdf

Î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

Generarea codului sursă și a unui fișier de cartografiere dintr-o


bază de date
Pentru a genera codul sursă al unei entități, trebuie să specificați opțiunea /code, urmată de
numele fișierului pe care doriți să-l creați. Generatorul încorporează limba corespunzătoare din extensia
de nume de fișier, utilizând extensia .cs pentru C # și extensia .vb pentru Visual Basic. Cu toate acestea,
puteți specifica în mod explicit o limbă utilizând /language:csharp sau /language:vb pentru a obține
codul C # sau Visual Basic. Sintaxa pentru a specifica baza de date de utilizat depinde de tipul bazei de
date și este aceeași cu cea descrisă în secțiunea precedentă, "Generarea unui fișier DBML dintr-o bază
de date".

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ă:

sqlmetal /server:localhost /database:Northwind /views /code:Northwind.vb

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

Următoarele opțiuni controlează modul în care sunt generate clasele entităților:

/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:

sqlmetal /server:localhost /database:Northwind /namespace:LinqBook /entitybase:DevLeap.


LinqBase /code:Northwind.cs
/serialization:unidirectional Specificați în linia de comandă dacă doriți să generați clase
serializabile, ca în exemplul următor:

sqlmetal /server:localhost /database:Northwind /serialization:unidirectional /code:Northwind.cs

/pluralize Controlează cum se generează numele entităților și proprietățile. Când specificați


această opțiune, numele entităților generate sunt singulare, dar numele tabelelor din proprietățile clasei
derivate din DataContext sunt plural, indiferent de forma tabelului. Cu alte cuvinte, prezența fie a unui
tabel client (sau clienți) generează o clasă de entitate client și o proprietate clienți în clasa derivată din
DataContext.

Generarea codului sursă și a unui fișier de cartografiere dintr-un


fișier DBML
Sintaxa pentru generarea codului sursă și a unui fișier de mapare dintr-un fișier DBML este
identică cu sintaxa necesară pentru a genera aceleași rezultate dintr-o bază de date, cu excepția faptului
că, în loc să specificați o conexiune la baza de date, specificați numele fișierului DBML ca parametru de
intrare. De exemplu, următoarea linie de comandă generează codul de clasă C# pentru descrierea
modelului Northwind.DBML: sqlmetal /code:Northwind.cs Northwind.dbml

S-ar putea să vă placă și