LINQ- VII LINQ TO SQL


…nastavak prethodnog posta

Posebne napomene uz LINQ to SQL dizajner

LINQ to SQL je jednostavni O/R dizajner i podržava mapiranje 1:1. To znači da dizajner mapira jednu klasu (entitet) i samo jednu Tabelu ili View. Složeno mapiranje objekata, poput mapiranja klasa i spojenih tabela nije za sada podržano. LINQ to SQL dizajner jednostrano generira kod. Ako napravimo ručne promjene u izvornom kodu to se neće reflektirati na dizajner. Samo promjene napravljene preko dizajnera u dizajnerskom modu reflektuju se u izvorni kod.

Modifikacija podataka sa LINQ To SQL

U dosadašnjim primjerima vidjeli smo kako uzvući podatke iz DB, koristeći LINQ to SQL. Takodjer, vidjeli smo kako izvlačiti podatke iz relacijski-povezanih tabela. U ovom dijelu vidjećemo na koji nači vršimo modifikaciju podataka. Modifikacija podataka se odvija preko klase DataContext.

Klasa DataContext

DataContext je centranla klasa koja upravlja svim transakcijama koje se dešavaju. Ova klasa je odgovorna za pristup Serveru DB, prosljedjivanju SQL upita, monitoring nad modificiranim podacima na klijentu (ObjectTracking), rješavanju konflikata kod slanja podataka na Server i mnogo više. Kada pogledamo izvorni kod koji je dizajner generirao za ovu klasi nećemo naći puno toga. Ona se uglavnom sastoji od nekoliko konstruktora preko kojih instanciramo objekat , te članove (fields) koji su entiteti modela. Ova klasa se u pravilu uvijek koristi kao izvedena jer tim načinom dobijamo tipizirani (strongly typed) DataContext.

Metode koje sadržava ova klasa možemo podijeliti na sljedeće:

· Metoda za manipulaciju sa DB

· Metode za izvršavanje upita

· SubmitChanges() – metoda za slanje podataka u DB

· Opcije za rješavanje konflikata prilikom slanja podataka u DB

· Transakcije

SabmitChanges()

Prilikom bilo kakvih promjena podataka na klijentu klasa DataContext sadrži mehanizam praćenja svih tih promjena. Ovaj mehanizam se zove CHANGE PROCESSOR, i zadužen je za praćenje promjena podataka na klijentu. Kada pozovemo SubmitChanges(), klasa DataContex će pokušati pretvoriti sve promjene u adekvatne upite i prosljediti SQL Serveru. Prilikom generiranja upita DataContext će na osnovu generiranog DB modela uvažavajući sve relacije izmedju klasa i sva ograničenja kolona te primarne i vanjske ključeve, generirati SQL upite, koji će sekvencijalno slati na server. Prije samog slanja formira se transakcija koja se prekida i vraća u prvobitno stanje podatke, ako najmanje jedan upit bude neuspješan. Tada se izbacuje izuzetak i upozorava korisnik da promjene nisu uspješno prosljeđene Serveru.

Obzirom da transakcija nije prošla, DataContext ima sve informacije o upitima koji stvaraju konflik. Na taj način obezbjeđeno je pozivanje ove metode više *** sa korekcijama konflikata. Kada poslije korigiranja promjena, metoda uspije bez izuzetaka DataContext se resetuje i iz početka prati novonastale promjena na klijetu. Više informacija oko ove metode i klase možete naći na kraju ovog članka u referencama. Slanje podataka na server i način na koji se to odigrava zavisi od osobina (properties) svake klase u modelu, koje su prethodno prikazane. Naredni primjer pokazaće način na koji manipulišemo podacima iz DB, odnosno korištenje standardnih SQL naredbi Select, Insert, Update, Delete ili jednostavno CRUD.

Primjer sa sastoji od modela NorthWind baze podataka. Ako je ne posjedujete možete je skinuti sa ovog linka.

1. Formirajte novi projekat u VS 2008, C# programskijezik, Windows Forms Application tip projekta. Slično prethodnim primjerima

2. Formirajte LINQ to SQL dbml model baze podataka, te mapirajte tabele kao na slici.

clip_image002

3. Otvorite cs datoteku Form1, te iz usidrenog prozora DataSource importujete prethodne tabele kao objekte. Nakon importovanja DataSource prozor izgleda kao na slici.

clip_image004

4. Povucite i spustite Tabelu Order, a iz njenog drveta povucite i spstite tabelu Order_Detail. Rezultat bi trebao da izgleda kao na sljedećoj slici:

clip_image006

5. Implementirajte dogadjaj FormLoad, te privatni član klase Form1, dcNorthWind klase NorthWindKlaseDataContext.

6. Napišite implementaciju dogadjaja kao na sljedećoj slici.

clip_image008

Obzirom da smo LINQ to SQL modelom definisali i relacije izmedju klasa, nije potrebno posebno implementirati upite za svaku tabelu. Dovoljo je implementirati upit za tabelu Order, a kako smo vidjeli u prethodnom primjeru (prethodni post), podaci za ostale tabele se generiraju iz tabele Order.

7. Pokrenite aplikaciju. Rezultat bi trebao da izgleda kao na sljedećoj slici.

clip_image010

Pomjerajući se kroz tabelu Order, relevantni podaci u tabeli Order_Details se pojavljuju, odnosno implementacija relacije Master/Detail je realizirana.

Modifikacija podataka

Da bi mogli modificirati podatke u tabelama potrebno je da se implementira opcija Save (neaktivna sličica i navigacijskog toolbara clip_image012). Da bi implementirali spremanje podataka u DB, dva *** kliknimo na prethodno dugme i implementirajno metodu kao na sljedećoj slici, te osobinu Enable stavimo na TRUE. Bez obzira kako kompleksna forma bila, metodom SubmitChange(), LIN to SQL pohranjuje kako jednostavne tako i kompleksne hiearhijske zapise u bazu.

clip_image014

clip_image016

Prethodni primjer unosa novih stavki u relaciju Master/Detail prezentira svu jačinu LINQ to SQL tehnologije. Za ovakav primjer bilo nam je potrebno puno više vremena i živaca, koristeći DataSet ili DataTable.

LINQ TO SQL i Storne Procedure

Jednostavnost i ušteda na implementaciji koju smo vidjeli u prethodnom primjeru ništa nije drugačija i kompleksnija i kod korištenja stornih procedura. Storne procedure kao što smo vidjeli mapiraju se u desni dio prozora dizajnera, povlačeći i spuštajući stornu proceduru iz baze podataka.

Sljedeći primjer pokazuje korištenje stornih procedura sa LIN to SQL. U prethodni primjer mapirajmo stornu prceduru kao na slici.

clip_image018

Implementirajmo novu formu SPForm2, te njen dogadjaj FormLoad, kao na slici. U Početnoj formi implementirajte Dugme Pozivanje SP, te dogadjaj ButtonClick.

clip_image020

Implementacija Dugmeta Pozivanje SP, izgleda kao na sljedećoj slici:

clip_image022

Kompajlirajete i pokreite aplikaciju, nakon klika na dugme Pozivanje SP, pojavljuje se prozor sličan kao na slici:

clip_image024

Izvorni kod za ovaj post možete skinuti odavde.

Reference:

1. http://msdn2.microsoft.com/en-us/vcsharp/aa336746.aspx

2. http://weblogs.asp.net/scottgu/

3. http://blogs.msdn.com/somasegar/

4. http://channel9.msdn.com

5. http://aspalliance.com/1331_Using_LINQ_to_SQL__Part_2.all

About Bahrudin Hrnjica

PhD in Mechanical Engineering, Microsoft MVP for .NET. Likes .NET, Math, Mechanical Engineering, Evolutionary Algorithms, Blogging.

Posted on 10/02/2008, in .NET, C# and tagged , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s