|
|
ORM DHE LINq – PJESA E PARE Written on March 20, 2010, by Visar Shehu. |
Gjate kesaj serie te postimeve, do te mundohem qe nepermjet te posteve te shkurtra, te shpjegoj se cfare paraqesin teknologjite ORM dhe LINQ dhe si mund te perdoren ne zgjidhjen e disa projekteve praktike.
LINQ (Language Integrated Query) paraqet nje teknologji te re te Microsoft qe perkrahet nga .NET 3.5 e siper, e cila mundohet te zgjedhe (ose lehtesoje) menyren e manipulimit me te dhena si databaza, XML ose te kolekcione rekordesh ne memorje (lista, vargje …).
ORM
Para se te flas per LINQ, ne dy pjeset e para te kesaj serie do paraqes nje hyrje te shkurter per Object Relational Mapping (ORM). ORM paraqet nje qasje (ose metodologji) programimi ku zhvilluesi mundohet qe te paraqese ne forme abstrakte objektet nga nje databaze (tabelat, lidhjet etj.) ne nje forme me te afert me konceptet e njohura nga modeli i orientuar ne objekte (OO Model).
Ekzistojne disa implementime komerciale dhe open source per ORM automatik. Ne kete post manualisht do te krijojme ORM, me specifikisht ate qe njihet Reverse Mapping (krijimi i klasave nga tabelat). Ky post nuk ka per qellim te pershkruje te gjithe specifikat e ORM, por vetem te parashtroje problemet e mundshme me te cilat do te ballafaqohej nje perdorues gjate krijimit te ORM.
Ne esence nje tabele ne databazen tone paraqet kolekcion reshtash dhe kolonash. Cdo resht mund te trajtohet si objekt, ndersa cdo kolone mund te trajtohet si atribut / karakteristike e atij objekti. Menjehere verehet nje ngjashmeri ndermjet tabelave dhe klasave. Cdo klase pershkruan nje objekt, objektet paraqesin instance te nje klase. Cdo objekt definohet nga karakteristikat e tij (qe implementohen me variabla) dhe sjelljeve (behaviors) te tij (qe implementohen me metoda).
Te marim nje shembull:
Me SQL kjo tabele do krijohej ne kete menyre:
CREATE TABLE Perdoruesit ( ID uniqueidentifier, Emri nvarchar(10) NULL, Mbiemri nvarchar(10) NULL, EmriPerdoruesit nvarchar(20) NOT NULL, Fjalekalimi nvarchar (50) NOT NULL, PRIMARY KEY (ID) )
Nga skema relacionale e kesaj tabele, shihet qarte se ne mund te definojme nje klase:
class Perdoruesi { public Guid ID { get; set; } public String Emri { get; set; } public String Mbiemri { get; set; } public String EmriPerdoruesit { get; set; } public String Fjalekalimi { get; set; } }
E qarte qe tani ne mund te krijojme instanca te kesaj klase:
Perdoruesi p = new Perdoruesi(); p.ID = Guid.NewID(); p.Emri = "Visar"; p.Mbiemri = "Shehu"; p.EmriPerdoruesit = "vshehu"; p.Fjalekalimi = "sekret";
Nga kjo mund edhe te krijojme kolekcione te tipit Perdorues:
List<Perdoruesit> lista = new List<Perdoruesit>(); lista.Add(p);
Pastaj dhe te manipulojme me to, psh ti listojme vetem ato perdorues Emri i te cileve fillon me shkronjen “A”:
foreach (Perdoruesi tmpP in lista) { if (tmpP.Emri.StartsWith("A")) { Response.Write(tmpP.Emri)); } }
Sidoqofte, deri tani ne kemi vetem nje kopje te skemes relacionale ne memorje. Cdo objekt qe do ta krijojme do te shkaterohet automatikisht dhe me te edhe te dhenat per ate objekt ose kolekcion. Qe te kemi nje aplikacion funksional ne duhet te implementojme CRUD operacionet (Create, Read, Update, Delete). Te gjithe keto do ti implementoj si metoda ne klasen Perdorues (qasje e cila eshte diskutabile, mirepo problemet me kete qasje do ti adresoj ne postin e ardhshem).
Create
Ky eshte edhe operacioni i pare qe do te deshim ta implementojme per objektin tone. Ideja eshte e thjeshte: te kemi nje mundesi qe objektin e krijuar ne memorje, ta regjistrojme si rekord ne databaze. Ne esence duam qe objekti jone te kete nje sjellje (behavior) qe do te ruaje gjendjen e ketij objekti. Sjelljet ne OO terminologjine implementohen me ane te metodave. Per rastin tone do te krijojme nje metode Save() qe do te na mundesoje kete. Klasa Perdoruesi tani do te kete kete forme:
class Perdoruesi { public Guid ID { get; set; } public String Emri { get; set; } public String Mbiemri { get; set; } public String EmriPerdoruesit { get; set; } public String Fjalekalimi { get; set; } public void Save() { String sql = "INSERT INTO Perdoruesit(ID, Emri, Mbiemri, EmriPerdoruesit, Fjalekalimi) VALUES (@ID, @Emri, @Mbiemri, @EmriPerdoruesit, @Fjalekalimi)"; SqlConnection con = new SqlConnection(); SqlCommand cmd = new SqlCommand(); cmd.CommandText = sql; //Shtojme parametrat e nevojshem cmd.Parameters.Add("@ID", this.ID); cmd.Parameters.Add("@Emri", this.Emri); cmd.Parameters.Add("@Mbiemri", this.Mbiemri); cmd.Parameters.Add("@EmriPerdoruesit", this.EmriPerdoruesit); cmd.Parameters.Add("@Fjalekalimi", this.Fjalekalimi); //Hapet konekcioni dhe ekzekutojme komanden con.ConnectionString = "Definojme connection string ketu"; con.Open(); cmd.ExecuteNonQuery(); con.Close(); } }
Shfrytezuesit e kesaj librarie do te shohin vetem kete Interface te klases tone:
Dhe kur nje shfrytezues do ta shfrytezoje kete klase, ai do te jete i sigurt se sapo ta perdore metoden Save() ne bazen e te dhenave do te regjistrohet nje perdorues i ri:
Perdoruesi p = new Perdoruesi(); p.ID = Guid.NewID(); p.Emri = "Visar"; p.Mbiemri = "Shehu"; p.EmriPerdoruesit = "vshehu"; p.Fjalekalimi = "sekret"; p.Save()
Ngjashem mund te implementohet edhe metoda Delete(). Ne postin e ardhshem do te flas se si mund te implementohen metodat tjera per leximin e nje ose me teper rekordeve, qe me vone te kalojme ne perdorimin e ndonje ORM te gatshem.
-
Visar Elmazi
3,554 views


