Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
UNIVERZA V MARIBORU
FAKULTETA ZA ELEKTROTEHNIKO,
RAČUNALNIŠTVO IN INFORMATIKO
Tadej Rola
PRIMERJAVA OGRODIJ ENTITY FRAMEWORK IN
NHIBERNATE ZA OBJEKTNO-RELACIJSKO
PRESLIKAVO
Diplomsko delo
Maribor, avgust 2017
PRIMERJAVA OGRODIJ ENTITY FRAMEWORK IN NHIBERNATE ZA
OBJEKTNO-RELACIJSKO PRESLIKAVO
Diplomsko delo
Študent: Tadej Rola
Študijski program: visokošolski strokovni študijski program
Informatika in tehnologije komuniciranja
Smer: Razvoj informacijskih sistemov
Mentor: viš. pred. dr. Boštjan Kežmah, univ. dipl. gosp. inž.
i
ii
ZAHVALA
Zahvaljujem se mentorju, prof. viš. pred. dr.
Boštjanu Kežmahu za pomoč in vodenje pri
opravljanju diplomskega dela.
Zahvaljujem se tudi najbližjim za podporo pri
študiju.
iii
Primerjava ogrodij Entity Framework in NHibernate za objektno-relacijsko preslikavo
Ključne besede: objektno-relacijska preslikava, entity framework, nhibernate, ADO.NET
UDK: 004.652.4.045(043.2)
Povzetek
V diplomskem delu primerjamo ogrodji za objektno-relacijsko preslikavo Entity Framework in
NHibernate. Na začetku smo razložili klasičen način dostopa do podatkovne baze preko ADO.NET
komponente, v nadaljevanju še O-RM tehnologijo. Nato je sledila podrobna predstavitev obeh
ogrodij. V drugem delu diplomskega dela najprej razložimo in prikažemo glavne funkcionalnosti
enega in drugega na praktičnem primeru. V zadnjem delu diplomskega dela pišemo o razlikah med
enim in drugim ter njunih prednostih in slabostih/pomanjkljivostih.
iv
Comparison of Entity Framework and NHibernate frameworks for object-relational mapping
Key words: object-relational mapping, entity framework, nhibernate, ADO.NET
UDK: 004.652.4.045(043.2)
Abstract
In this diploma thesis we are comparing frameworks for object-relational mapping Entity
Framework and NHibernate. At first we discussed about classic data access technology component
ADO.NET. Then a detailed presentation of both frameworks was followed. In the second part of the
thesis, we first explain and show the main functionalities of one and the other in a practical case. In
the final part of the thesis, we write about the differences between one and the other and their
advantages and weaknesses / deficiencies.
v
KAZALO
1 UVOD................................................................................................... 1
1.1 OPREDELITEV PODROČJA IN PROBL EMA ........................................................................................................ 1
1.2 PREDPOSTAVKE IN OMEJITVE ........................................................................................................................... 1
1.3 PREDSTAVITEV OSNOVNIH METOD DELA ...................................................................................................... 2
2 DOSTOP DO PODATKOV V PROGRAMSKEM JEZIKU .............................. 3
2.1 ADO.NET ................................................................................................................................................................ 3
2.1.1 ARHITEKTURA IN KOMPONENTE ADO.NET................................................................................................. 4
2.1.2 PRIMERJAVA ADO.NET IN ADO ..................................................................................................................... 7
2.2 OBJEKTNO RELACIJSKA PRESLIKAVA ............................................................................................................... 8
2.2.1 SPLOŠNO ........................................................................................................................................................... 9
2.2.2 PREDNOSTI UPORABE O-RM ......................................................................................................................... 9
2.2.3 SLABOSTI UPORABE O-RM ...........................................................................................................................10
2.3 PRIMERJAVA TRADICIONALNE TEHNIKE DOSTOPA IN O-RM...................................................................11
3 ENTITY FRAMEWORK ......................................................................... 13
3.1 OSNOVNE FUNKCIONALNOSTI EF ...................................................................................................................14
3.2 ARHITEKTURA EF................................................................................................................................................14
3.2.1 PONUDNIKI PODATKOV................................................................................................................................15
3.2.2 ENTITETNI ODJEMALEC ................................................................................................................................16
3.2.3 OBJEKTNE STORITVE .....................................................................................................................................17
3.3 RAZVOJ ENTITY FRAMEWORKA ......................................................................................................................17
3.4 PRISTOPI K RAZVOJU.........................................................................................................................................20
3.4.1 CODE FIRST PRISTOP .....................................................................................................................................20
3.4.2 MODEL FIRST PRISTOP ..................................................................................................................................21
3.4.3 DATABASE FIRST PRISTOP ............................................................................................................................21
vi
4 NHIBERNATE ...................................................................................... 22
4.1 OSNOVNE FUNKCIONALNOSTI NHIBERNATA ..............................................................................................22
4.2 ARHITEKTURA NHIBERNATE ............................................................................................................................23
4.2.1 STANJE OBJEKTOV PERSISTENČNIH RAZREDOV .......................................................................................25
4.3 RAZVOJ NHIBERNATE........................................................................................................................................26
5 UPORABA FUNKCIONALNOSTI NA PRAKTIČNEM PRIMERU ................. 28
5.1 UPORABA ENTITY FRAMEWORK ....................................................................................................................29
5.1.1 PRIPRAVA RAZVOJNEGA OKOLJA................................................................................................................29
5.1.2 IZDELAVA MODELA........................................................................................................................................29
5.1.3 OSNOVNE CRUD OPERACIJE ........................................................................................................................34
5.1.4 SHRANJENE PROCEDURE..............................................................................................................................37
5.1.5 LINQ .................................................................................................................................................................38
5.2 UPORABA NHIBERNATE....................................................................................................................................39
5.2.1 PRIPRAVA RAZVOJNEGA OKOLJA................................................................................................................39
5.2.2 IZDELAVA MODELA........................................................................................................................................40
5.2.3 OSNOVNE CRUD OPERACIJE ........................................................................................................................42
5.2.4 SHRANJENE PROCEDURE..............................................................................................................................45
5.2.5 LINQ .................................................................................................................................................................45
6 PRIMERJAVA EF IN NHIBERNATE ........................................................ 47
6.1 PODPORA RAZLIČNIM SUPB ............................................................................................................................47
6.2 PRESL IKAVA PODATKOVNIH TIPOV ...............................................................................................................47
6.3 PRIMERJAVA FUNKCIONALNOSTI ..................................................................................................................48
6.4 HITROST KL ICEV NA PODATKOVNO BAZO ....................................................................................................51
6.4.1 DODAJANJE PODATKOV ...............................................................................................................................51
6.4.2 BRANJE PODATKOV .......................................................................................................................................52
6.4.3 UREJANJE PODATKOV ...................................................................................................................................52
6.4.4 BRISANJE PODATKOV....................................................................................................................................53
vii
6.5 PREDNOSTI/SLABOSTI OGRODIJ.....................................................................................................................54
7 SKLEP ................................................................................................. 55
8 LITERATURA ....................................................................................... 56
KAZALO SLIK
SLIKA 2.1: ZGRADBA MODELA ADO.NET [2] .................................................................................. 3
SLIKA 2.2: ARHITEKTURA IS, KI UPORABLJA O-RM ............................................................................ 8
SLIKA 3.1: ARHITEKTURA ENTITY FRAMEWORKA [15] ...................................................................... 14
SLIKA 3.2: MODEL PONUDNIKA PODATKOV [16]............................................................................. 15
SLIKA 3.3: RAZLIKA MED EF5 (LEVO) IN EF6 (DESNO)...................................................................... 19
SLIKA 4.1: "LITE" ARHITEKTURA NHIBERNATE [22] ......................................................................... 23
SLIKA 4.2: "FULL CREAM" ARHITEKTURA NHIBERNATE [22].............................................................. 24
SLIKA 5.1: E-R DIAGRAM MODELA ............................................................................................... 28
SLIKA 5.2: ČAROVNIK ZA DODAJANJE NOVEGA ELEMENTA EDM ......................................................... 31
SLIKA 5.3: EDM MODEL ZA PRIMER TRGOVINE S SKALARNIMI IN NAVIGACIJSKIMI SPREMENLJIVKAMI ......... 32
SLIKA 5.4: IZDELANI RAZREDI Z UPORABO EDM MODELA .................................................................. 32
SLIKA 5.5: IZBIRA OBJEKTOV, KI JIH ŽELIMO V MODELU IZ PB ............................................................. 33
SLIKA 5.6: MODEL GENERIRAN NA OSNOVI OBSTOJEČE PODATKOVNE BAZE ........................................... 34
SLIKA 5.7: ORODJE, KI OMOGOČA RAZVOJ PO PRINCIPU DATABASE-FIRST ............................................. 42
KAZALO PROGRAMSKE KODE
PROGRAMSKA KODA 2.1: PRIDOBITEV PODATKOV V OBLIKI XML IN NAPOLNJENI V DATASET ..................... 5
PROGRAMSKA KODA 2.2: DOSTOP DO PODATKOV Z UPORABO SQL SERVER PONUDNIKA PODATKOV ........... 6
PROGRAMSKA KODA 5.1: DEFINICIJA RAZREDA "RACUN".................................................................. 30
PROGRAMSKA KODA 5.2: CONNECTION STRING, KI KAŽE POT DO PODATKOVNEGA STREŽNIKA .................. 30
PROGRAMSKA KODA 5.3: UKAZ, KI GENERIRA PODATKOVNO BAZO NA PODLAGI MODELA ........................ 30
PROGRAMSKA KODA 5.4: FUNKCIJA, KI VRNE VSE OBJEKTE TIPA "IZDELEK" IZ PB ................................... 35
PROGRAMSKA KODA 5.5: METODA, KI DODA NOVI OBJEKT TIPA "IZDELEK" V PB ................................... 36
viii
PROGRAMSKA KODA 5.6: METODA, KI POSODOBI OBJEKT TIPA "IZDELEK" V PB NA PODLAGI PARAMETRA... 36
PROGRAMSKA KODA 5.7: METODA, KI IZBRIŠE OBJEKT TIPA "IZDELEK" V PB ......................................... 37
PROGRAMSKA KODA 5.8: IZVRŠEVANJE PROCEDURE Z UPORABO EF .................................................... 37
PROGRAMSKA KODA 5.9: QUERY SINTAKSA (LEVO) IN METHOD SINTAKSA (DESNO) ZA IZPIS VSEH STRANK... 38
PROGRAMSKA KODA 5.10: QUERY SINTAKSA (LEVO) IN METHOD SINTAKSA (DESNO) ZA POGOJNI IZPIS....... 38
PROGRAMSKA KODA 5.11: QUERY SINTAKSA (LEVO) IN METHOD SINTAKSA (DESNO) ZA SORTIRAN IZPIS ..... 39
PROGRAMSKA KODA 5.12: DEFINICIJA RAZREDA "STRANKA" ............................................................. 40
PROGRAMSKA KODA 5.13: KONFIGURACIJA PRESLIKAVE »STRANKA« (LEVO) IN »RACUN« (DESNO) ......... 41
PROGRAMSKA KODA 5.14: METODA ZA GENERIRANJE TABEL IN PRAVIL V PODATKOVNI BAZI .................... 41
PROGRAMSKA KODA 5.15: FUNKCIJA, KI VRNE SEZNAM RAČUNOV ...................................................... 43
PROGRAMSKA KODA 5.16: METODA, KI DODA NOV RAČUN............................................................... 43
PROGRAMSKA KODA 5.17: METODA ZA POSODABLJANJE RAČUNA ...................................................... 44
PROGRAMSKA KODA 5.18: METODA ZA IZBRIS RAČUNA ................................................................... 44
PROGRAMSKA KODA 5.19: KLIC PROCEDURE, KI VRNE SEZNAM RAČUNOV DOLOČENE STRANKE................. 45
PROGRAMSKA KODA 5.20: QUERY SINTAKSA (LEVO) IN METHOD SINTAKSA (DESNO) ZA IZPIS RAČUNOV ..... 46
PROGRAMSKA KODA 5.21: QUERY SINTAKSA (LEVO) IN METHOD SINTAKSA (DESNO) ZA POGOJNI IZPIS....... 46
KAZALO GRAFOV
GRAF 6.1: ČAS V ODVISNOSTI OD KOLIČINE VSTAVLJENIH PODATKOV ZA POSAMEZNO OGRODJE ................ 51
GRAF 6.2: ČAS V ODVISNOSTI OD KOLIČINE BRANIH PODATKOV .......................................................... 52
GRAF 6.3: ČAS V ODVISNOSTI OD KOLIČINE UREJANIH PODATKOV ....................................................... 52
GRAF 6.4: ČAS V ODVISNOSTI OD KOLIČINE BRISANIH PODATKOV ........................................................ 53
KAZALO TABEL
TABELA 2.1: PRIMERJAVA ADO IN ADO.NET [6] ............................................................................ 7
TABELA 2.2: PRIMERJAVA KLASIČNEGA PRISTOPA IN O-RM .............................................................. 12
TABELA 6.1: PRESLIKAVA .NET PODATKOVNIH TIPOV V MS SQL SERVER Z OBEMA TEHNOLOGIJAMA ........ 47
TABELA 6.2: PRIMERJAVA LASTNOSTI OBEH OGRODIJ ....................................................................... 54
ix
UPORABLJENE KRATICE
EF - Entity Framework
ADO - ActiveX Data Objects
PB - Podatkovna baza
O-RM - Object-Relational Mapping
MDAC - Microsoft Data Access Components
API - Application Programing Interface
LINQ - Language INtegrated Query
CRUD - Create, Read, Update, Delete operacije
SUPB - Sistem za Upravljanje s Podatkovnimi Bazami
IS - Informacijski sistem
1
1 UVOD
1.1 OPREDELITEV PODROČJA IN PROBLEMA
V obdobju hitrega razvoja aplikacij je nadvse pomembno, katere tehnologije izberemo.
Odločitev, kako bomo s podatki manipulirali, je pri razvoju med glavnimi vprašanji in prav
zaradi tega je potrebno ta del še posebej dobro načrtovati. Zaradi različnih tehnologij je
potrebno poznati tudi različne povpraševalne jezike, ki pa so v splošnem definirani kot niz
znakov, kar pomeni, da hitreje pride do tipkarskih napak, ki jih lahko odkrijemo šele v času
izvajanja aplikacije. Podatki pa se morajo še vedno ročno preslikati med podatkovno bazo
in objekti. Orodja za objektno-relacijsko preslikavo avtomatizirajo prav ta postopek. To je
programska tehnika za manipulacijo s podatki iz podatkovne baze z uporabo objektno
orientiranih programskih jezikov. Omogočajo tudi izdelavo same podatkovne baze iz v
naprej pripravljenih razredov ter še veliko drugih funkcionalnosti, ki jih želimo tekom dela
raziskati. Za .NET ogrodje je na voljo precej knjižnic, kjer pa vidno izstopata predvsem dve.
To sta Entity Framework in NHibernate. Tako kot pri ostalih tehnologijah je tudi tukaj tako,
da ima vsaka svoje prednosti in slabosti, ki smo jih tekom izdelave dela izpostavili.
1.2 PREDPOSTAVKE IN OMEJITVE
V diplomskem delu smo se osredotočili zgolj na prikaz delovanja aplikacije z uporabo
ogrodij za objektno-relacijsko preslikavo, Entity Framework ali NHibernate. Omejitve so
tudi pomanjkanje knjižnih virov za izbrano področje, zato smo omejeni skoraj izključno na
splet. Zavedamo se, da obstaja še veliko drugih ogrodij za objektno-relacijsko preslikavo. Z
omejitvijo zgolj na ti dve smo dobili natančnejšo sliko, katero izmed teh bi razvijalec naj
izbral v določeni situaciji. Praktične primere smo razvijali/prikazovali v razvojnem okolju
Visual Studio 2015 z uporabo programskega jezika C#.
2
1.3 PREDSTAVITEV OSNOVNIH METOD DELA
V diplomskem delu smo uporabili deskriptivno oziroma opisno metodo, s katero smo
opisovali teorijo in pojme z uporabo predvsem tuje literature in svojega znanja. Uporabili
smo tudi metodo komparacije, s katero smo primerjali teorijo in dela različnih avtorjev, za
podobno tematiko.
3
2 DOSTOP DO PODATKOV V PROGRAMSKEM JEZIKU
2.1 ADO.NET
Microsoft je izdal knjižnico za ogrodje .NET z vsebujočim naborom razredov, ki izpostavijo
podatkovni dostop .NET razvijalcu. Omogoča komunikacijo med relacijskimi in ne-
relacijskimi sistemi s skupnim sklopom komponent. ADO.NET je skupek programskih
komponent, ki jih razvijalci lahko uporabljamo za dostop in delo s podatki iz podatkovne
baze. Za uporabo funkcionalnosti, ki jih tehnologija ponuja, ni potrebe po dodatnem
sklicevanju na knjižnico, saj je že v osnovi podprta v ogrodju .NET. [1]
Slika 2.1: Zgradba modela ADO.NET [2]
Čeprav beseda ADO.NET izvira iz predhodnika programskega modela ADO (ActiveX Data
Objects), lahko to orodje štejemo kot povsem nov Microsoftov produkt za dostop do
podatkovne baze. ADO je bil prvotno namenjen COM razvijalcem. Obe tehnologiji sicer
izvirata iz Microsoftovih komponent za podatkovni dostop (MDAC), ki je bil zasnovan, da
razvijalcem omogoča enoten in celovit način razvoja aplikacij z dostopnostjo do celotnega
4
podatkovnega vira. Poleg že omenjenih tehnologij dostopa do podatkovne baze, MDAC
vključuje tudi naslednje komponente: [3]
• OLE DB (Object Linking and Embedding Database),
• ODBC (Open Database Connectivity),
• RDS (Remote Data Services) - zastarelo,
• MSDASQL (OLEDB ponudnik za ODBC) - zastarelo.
2.1.1 ARHITEKTURA IN KOMPONENTE ADO.NET
Obdelava podatkov je običajno potekala na povezovalnem dvo-nivojskem modelu. Zaradi
širjenja obdelave podatkov na več nivojev se je pojavila več nivojska arhitektura, katere se
v razvijalci poslužujejo. To aplikacijam povečuje predvsem možnost razširljivosti.[4]
Glavni komponenti ogrodja ADO.NET za dostop in delo s podatki sta ponudnik podatkov
(angl. »Data provider«) - potrebna povezava, ter DataSet.
DATA SET
Je bil načrtovan z namenom dostopa do podatkov. Je neodvisen od vira podatkov. To
pomeni, da se lahko uporablja z različnimi viri podatkov, kot tudi z XML podatki ali lokalnimi
podatki v aplikaciji. Vključuje najmanj en objekt DataTable, ki ima vrstice, stolpce, primarne
ključe, tuje ključe, omejitve in informacije o povezavah znotraj tega objekta. Tekom dela s
komponento DataSet ni potrebna povezava, saj zagotavlja tako imenovan brez-povezavni
način dostopa. Za razliko od komponente Data Provider, kjer je za delovanje tekom
uporabe potreben objekt razreda Connection, ki zagotavlja povezavo do vira.
Komponenta DataSet za povezavo do vira podatkov uporablja objekt razreda DataAdapter.
Ta objekt predstavlja most med objektom DataSet in virom podatkov. Uporablja objekt
ukaza (angl. »Command«), ki izvršuje SQL stavke ter polni DataSet s podatki. Prav tako
spremlja spremembe, ki se dogajajo na podatkih ter jih lahko potrdi na osnovni vir. [4]
5
Programska koda 2.1: Pridobitev podatkov v obliki XML in napolnjeni v DataSet
PONUDNIK PODATKOV
So pod-komponente, ki so bile načrtovane za manipulacije s podatki in predvsem za hiter
in »read-only« dostop do podatkov.
Ponudniki podatkov v sklopu .NET ogrodju so [5]:
• ponudnik podatkov za SQL Server (ponuja dostop do podatkov za Microsoftov SQL
strežnik - znotraj System.Data.SqlClient imenskega prostora),
• ponudnik podatkov za OLE DB (za vir podatkov z uporabo OLE DB - znotraj
System.Data.OleDb imenskega prostora),
• ponudnik podatkov za ODBC (za vir podatkov z uporabo ODBC - znotraj
System.Data.Odbc imenskega prostora),
• ponudnik podatkov za Oracle (za vir podatkov na Oraclovi podatkovni bazi.
Omogoča podpora od verzije 8.1.7 dalje - znotraj System.Data.OracleClient
imenskega prostora),
• EntityClient ponudnik podatkov (ponuja dostop do podatkov za Entity Data Model
(EDM) aplikacije - znotraj System.Data.EntityClient imenskega prostora),
• ponudnik podatkov za SQL Server Compact 4.0 (ponuja dostop do podatkov za
Microsoftov SQL strežnik Compact 4.0 - znotraj System.Data.SqlServerCe
imenskega prostora)
6
Glavni objekti .NET ogrodja za zagotavljanje podatkov so:
• objekt povezave (angl. »Connection«), ki predstavlja povezljivost do podatkovne
shrambe,
• objekt ukaza (angl. »Command«), ki omogoča proženje shranjenih procedur,
spreminjanje podatkov, vračanje podatkov,…,
• objekt bralca podatkov (angl. »Data Reader«), ki zagotavlja visoko zmogljiv tok
(angl. »stream«) podatkov med virom podatkov in odjemalcem.
Programska koda 2.2: Dostop do podatkov z uporabo SQL Server ponudnika podatkov
7
2.1.2 PRIMERJAVA ADO.NET IN ADO
ADO ADO.NET
Poslovni model
Večino v uporabi povezavno-
orientirani modeli
Brezpovezavno orientirani
modeli (sporočilno usmerjeni)
Odklopljen
dostop
Zagotavlja »Record Set« Zagotavlja »Data Adapter« in
»Data Set«
XML podpora Omejena Polna podpora
Model povezave
Odjemalec mora biti neprestano
povezan s podatkovnim
strežnikom tekom dela na
podatkih, razen v odklopljenem
dostopu
Odjemalec je prekinjen takoj, ko
so podatki procesirani. »Data
Set« je vedno izklopljen
Prenos podatkov ADO objekti komunicirajo v
dvojiškem načinu
Uporablja se XML
Podpora v času
načrtovanja
Pridobijo se informacije o
podatkih v času izvajanja na
podlagi metapodatkov, ki pa so
po navadi dragi za pridobitev
Uravna znane metapodatke v
času načrtovanja, da zagotovi
boljšo zmogljivost in
konsistentnost v času izvajanja
Tabela 2.1: Primerjava ADO in ADO.NET [6]
8
2.2 OBJEKTNO RELACIJSKA PRESLIKAVA
V objektnem okolju se vse vrti okoli objektov. Objekti so predmeti, ki nosijo podatke. V
relacijskem svetu pa je dela s tabelami in vrsticami, kar je drugače napram objektom. V
objektnem svetu imamo enosmerne asociacije (npr. če ima stranka kazalnik na naročilo, ne
pomeni nujno, da ima tudi naročilo kazalnik na stranko). V relacijskem okolju so vse
asociacije dvosmerne, kar se naredi s tujimi ključi. Vse asociacije so po naravi dvosmerne,
zato se moramo pri objektno-relacijskih preslikavah ukvarjati s temi prekinitvami. V
objektnem okolju je poznano dedovanje, kjer npr. vozila lahko imajo različne podrazrede,
torej je avto podrazred vozila, čoln je podrazred vozila, športni avto je podrazred avta. Tako
dobimo dedovane relacije. Relacijsko okolje ne pozna pojma dedovanja.
Uporaba zgolj orodja za upravljanje s podatkovno bazo ni zadostno za poizvedbe v
kompleksnejših aplikacijah, saj moramo običajno s podatki kasneje tudi operirati. To
zajema pogojevanje, vejitve, zanke,… In takšnih funkcionalnosti poizvedbeni programski
jezik SQL ne omogoča. Zato se za manipulacijo s podatki zanesemo na programski jezik, v
katerem aplikacijo pišemo. Za dostop podatkov iz podatkovne baze v programskem jeziku
imamo na voljo različne tehnologije. Mi se bomo osredotočili na teoretični in praktični del
tehnologije za objektno-relacijsko preslikavo.
Slika 2.2: Arhitektura IS, ki uporablja O-RM
9
2.2.1 SPLOŠNO
O-RM je v računalniški vedi programska tehnika za pretvorbo podatkov med
nekompatibilnimi sistemskimi tipi v objektno orientiranih programskih jezikih. Kot rezultat
uporabe takšnih orodij dobimo »virtualno objektno podatkovno bazo«, ki jo lahko
uporabljamo znotraj programskega jezika. [7]
Objektno-relacijska preslikava skrbi za vzpostavitev povezave do podatkovnega vira,
izvrševanje komand, izdelava poizvedb, preslikava rezultatov iz poizvedb v objekte, ki jih
aplikacija potrebuje. Pomembna funkcionalnost O-RM tehnologij je tudi sledenje
spremembam na objektih, ki jih lahko glede na ukaz potrdimo na podatkovno bazo ali jih
zavržemo.
Na voljo je veliko število tako brezplačnih kot tudi komercialnih ter odprtokodnih rešitev za
implementacijo O-RM tehnologije. Vendar ne moramo mimo dejstva, da pri uporabi
vendarle prednjačita dva. In to sta Microsoftov produkt Entity Framework ter odprtokodni
Hibernate. Slednji je sicer v osnovi napisan v programskem jeziku Java, vendar so izdali
verzijo tudi za Microsoftovo platformo .NET, ki pa se imenuje NHibernate. Zaradi
razširjenosti prav teh dveh orodij na trgu ju bomo podrobneje opisali, prikazali delovanje,
primerjali razlike med njima ter seveda izpostavili prednosti in slabosti ene ter druge.
2.2.2 PREDNOSTI UPORABE O-RM
Objektno relacijske preslikave so v velikem odstotku uporabne za avtomatizacijo poizvedb,
kjer je to mogoče. Moč O-RM se pokaže v aplikacijah, kjer je strogo objektna arhitektura
skupaj s podatkovno bazo, ki dobro deluje z objektnim modelom. Če ima razvojna ekipa
veliko izkušenj z objektno orientiranim programiranjem, potem je uporaba O-RM lahko
vidna prednost v času razvoja in načrtovanja.
10
Obstajajo primeri, kjer so poizvedbe bolj optimalne, če jih spišemo ročno, preko klasičnih
SQL stavkov. V takšnih primerih se umaknemo od O-RM načina. S takšnim pristopom ne
smemo pretiravati, kajti v primeru, da je aplikacija nameščena na več podatkovnih
strežnikih, lahko pride do prevelike odvisnosti kode od podatkovne baze. Temu se želimo
izogniti prav z uporabo O-RM tehnologij. Razvijalec mora tudi upoštevati, da se bo aplikacija
testirala na vseh platformah, na katerih bo zagotavljal podporo le-te. [7]
Prednosti, ki jih je potrebno izpostaviti:
• omogoča implementacijo domenskega modela (model, ki predstavlja podatke in
logiko). O-RM zagotavlja to s preslikavami med logičnim poslovnim modelom in
fizičnim podatkovnim modelom,
• občutno zmanjšanje količine kode za delo s podatki, kar pomeni hitrejši razvoj,
• spremembe na podatkih so vidne takoj, saj O-RM sledijo spremembi objekta,
• velika podpora za poizvedbe (tako Entity Framework kot NHibernate omogočata
uporabo LINQ poizvedb) ,
• možnost konfiguracije, katere podatke želimo naložiti med poizvedbo,
• omogoča delo na istih podatkih več uporabnikom hkrati,
• omogoča upravljanje predpomnilnika, ki zmanjša ponovni čas nalaganja iz
podatkovne baze,
• spremembe na objektih se pišejo v transakcije. Te se nato lahko potrdijo ali
zavržejo,
• O-RM upravlja s ključi.
Kot glavno prednost, zakaj bi se razvijalci odločili za uporabo O-RM tehnologij, moramo
izpostaviti hitrost razvoja aplikacije. Čeprav bi kot razvijalci morali poznati vsaj osnove SQL
poizvedb, pa to znanje z uporabo O-RM praktično več ni potrebno. Tehnologiji, kot sta
NHibernate in Entity Framework, samostojno generirata SQL stavke namesto razvijalca.
Tukaj nastane vprašanje kvalitete SQL stavkov. [8]
2.2.3 SLABOSTI UPORABE O-RM
Na drugi strani obstajajo tudi slabosti teh tehnologij oziroma kjer se O-RM tehnologije ne
obnesejo najbolje in je bolje poseči po klasičnih poizvedbah. Obstajajo tudi članki, ki strogo
odsvetujejo uporabo teh tehnologij. [9]
11
Našteli bomo nekaj primerov, kjer se ta tehnologija ne izkaže za najboljšo:
• če podatkovni model ne ustreza O-R preslikovanju. To se lahko izkaže tudi, če
uporabljamo npr. vmesnike (angl. »interface«), s katerimi polnimo ali pridobivamo
podatke. V tem primeru je boljše uporabiti direktni podatkovni dostop,
• finančne aplikacije ali drugi sistemi, kjer je integriteta podatkov v porazdeljenih
sistemih pomembna, še posebej, če je dela s kompleksnimi transakcijami, ki
zahtevajo dvo-fazno potrditev,
• visoko zmogljive aplikacije, ki zahtevajo popolnoma optimiziran dostop do
podatkovne baze,
• v primeru, da želimo v aplikaciji zaradi izkušenj uporabljati (oziroma že
uporabljamo) uveljavljeno tehnologijo za dostop do podatkovne zbirke (kot je na
primer čisti ADO.NET), bi bila smiselnost implementacije z uporabo O-RM
tehnologije vprašljiva.
• če je struktura obstoječe podatkovne baze težko prenosljiva v objekte.
Kot glavna razloga, zakaj razvijalci, ki so vajeni tradicionalnega dostopa do podatkovne
baze, ne bi prevzeli nove tehnologije iz nabora O-RM, sta prav gotovo [10]:
• nepoznavanje objektno orientiranega programiranja,
• strah/odpor pred učenjem nove tehnologije.
2.3 PRIMERJAVA TRADICIONALNE TEHNIKE DOSTOPA IN O-RM
Ko primerjamo s tradicionalnimi tehnikami, moramo seveda omeniti klasičen pristop dela
s podatki preko SQL stavkov ali morda preko shranjenih postopkov, ki so na podatkovnem
strežniku (angl. »stored procedure«). Pomanjkljivosti, ki jih lahko naštejemo pri klasičnem
pristopu, so velike napram O-RM tehnologijam.
12
PREDNOSTI SLABOSTI
KLASIČNI
PRISTOPI
• velika fleksibilnost,
• popolni nadzor nad SQL,
• uporabljena polna zmogljivost
podatkovnega strežnika.
• potrebno je znanje SQL,
• »stored procedure« so
zunaj razvojnega okolja,
• veliko enake kode za
različne poizvedbe (pisanje
imena tabel, stolpcev),
• velika možnost porušitve
aplikacije ob spremembi
imena tabele v PB,
• počasen razvoj.
O-RM
• hiter razvoj,
• logika za delo s podatki je
znotraj razvojnega okolja,
• imunost na spremembe na
podatkovni bazi/modelu
(potrebne so zgolj migracije).
• zmogljivost je (lahko)
slabša,
• majhen, oziroma nikakršen
nadzor nad SQL stavki, ki jih
generira O-RM,
• zaradi velike abstrakcije pri
uporabi O-RM je delovanje
»pod pokrovom«
nevidno/nejasno.
Tabela 2.2: Primerjava klasičnega pristopa in O-RM
13
3 ENTITY FRAMEWORK
Pisanje in upravljanje kode zgolj preko klasičnega načina dostopa do podatkovne baze (npr.
ADO.NET), je, kot smo lahko videli, precej nečisto in monotono delo. Zato je Microsoft
izdelal lastno O-RM orodje, imenovano Entity Framework, ki avtomatizira aktivnosti
povezane z podatkovno bazo v času razvoja aplikacije. Prva verzija je bila izdana leta 2008.
Microsoftov namen ob izdaji je bil vzpostavitev interakcije med .NET aplikacijami in
relacijskimi podatkovnimi bazami. EF je odprtokodno orodje, ki temelji na ADO.NET. [11]
Entity Framework je O-RM orodje, ki razvijalcu omogoča delo z relacijskimi podatki kot
domensko-specifičnimi razredi. Izloča večino kode, ki jo mora razvijalec pisati za delo s
podatkovnimi bazami. Za pisanje poizvedb na PB z uporabo Entity Frameworka se uporablja
LINQ, ki se pretvori v klasično SQL poizvedbo. Ta nato vrne strogo tipizirane objekte , s
katerimi lahko manipuliramo. Tako kot večina ostalih O-RM orodij, tudi Entity Framework
zagotavlja vodenje sprememb na objektu, »lazy loading«, podporo velikemu naboru
podatkovnih strežnikov,… Načelo EF je, da se razvijalec osredotoči na poslovno logiko
aplikacije, ki jo razvija, in da se mu delo s podatkovnim dostopom maksimalno poenostavi.
Cilj vsakega O-RM orodja je povečanje produktivnosti razvijalcev ter zmanjšanje
redundantnosti nalog, zadolženih za delo s podatkovnim dostopom. Omogoča generiranje
in izvrševanje potrebnih komand do podatkovne baze za branje, pisanje ali posodabljanje
podatkov. Poizvedbe lahko pretvorimo v domenske objekte s pomočjo LINQ do entitet
(angl. »LINQ to entities«). EF izvrši zahtevano poizvedbo na podatkovno bazo, rezultate pa
nato pretvori v instance domenskega objekta, ki ga lahko uporabljamo znotraj aplikacije.
[12]
14
3.1 OSNOVNE FUNKCIONALNOSTI EF
V seznamu so naštete glavne in največkrat uporabljene funkcionalnosti ter lastnosti Entity
Frameworka: [13]
• razvit kot odprtokodno orodje,
• neodvisen od razvoja .NET ogrodja,
• deluje z večino (vsemi) relacijskimi podatkovnimi bazami,
• generiranje SQL stavkov s pomočjo komponente »LINQ to Entities« ,
• omogoča in generira parameterizirane poizvedbe,
• sledi spremembam na objektih v pomnilniku,
• omogoča izdelavo komand za vstavljanje, brisanje in posodabljanje podatkov,
• deluje z vizualnim modelom ali z lastnimi razredi,
• podpora za shranjene postopke (angl. »stored procedures«).
3.2 ARHITEKTURA EF
Arhitektura orodja Entity Framework (Slika 3.1) je v grobem razdeljena na tri glavne
komponente: [14]
• ponudnik podatkov (angl. »data provider«), ki skrbi za generiranje SQL stavkov,
• entitetni odjemalec (angl. »entity client«), ki omogoča uporabo entitet, ki
predstavljajo konceptualni model,
• objektne storitve (angl. »object service«), ki predstavljajo sejo med aplikacijo in
virom podatkov.
Slika 3.1: Arhitektura Entity Frameworka [15]
15
3.2.1 PONUDNIKI PODATKOV
Njihova naloga je prevajanja programskih poizvedovalnih jezikov (kot je npr. LINQ) v čisto
SQL sintakso. To izvajajo z uporabo komandnega drevesa. Prevedene SQL stavke pa nato
prožijo na izbrano podatkovno bazo.
Entity Framework je neodvisen od podatkovne baze saj zagotavlja dostop do podatkov
preko ADO.NET, na katerem temelji in kateri omogoča, da se poveže z različnimi
podatkovnimi viri. Ponudniki podatkov zagotavljajo naslednje funkcionalnosti:
• preslikava Entity Data Modela (EDM) tipe v tipe, ki jih nosi ponudnik podatkov,
• izpostavlja funkcije, ki so specifične za ponudnika,
• ustvari ukaze, specifične za ponudnika, iz podane Entity Framework poizvedbe,
• omogoča posodabljanje sprememb na objektih skozi EF,
• omogoča definirano shemo podatkovne baze generirati v modele,
• izpostavlja metapodatke (npr. tabele, pogledi) skozi konceptualni model.
Slika 3.2: Model ponudnika podatkov [16]
16
3.2.2 ENTITETNI ODJEMALEC
Entitetni odjemalec (angl. »entity client«) je prva plast nad ponudniki podatkov ADO.NET.
Poleg klasičnih funckionalnosti ponudnikov podatkov ta plast dodatno ponuja razvijalcem,
da lahko delajo z entitetami v obliki vrstic in stolpcev z uporabo SQL poizvedb brez potrebe
po ustvarjanju razredov, ki predstavljajo konceptualno shemo. Izpostavlja entitetno plast
višjim plastem. Enitetni odjemalec prikazuje EF plasti, ki so glavna funkcionalnost. Te plasti
so poimenovane Enitetetni Podatkovni Model (angl. »Entity Data Model«). Zraven naštetih
plasti, ki so del EDM, sta del nivoja entitetnega odjemalca tudi storitve metapodatkov in
sistem za preslikavo. [13]
SHRANJEVALNA PLAST (angl. »storage layer«):
Vsebuje celotno shemo podatkovne baze v XML formatu.
ETITETNA PLAST (angl. »entity layer«):
Definira entitete in relacije med entitetami. Prav tako v XML formatu.
PRESLIKOVALNA PLAST (angl. »mapping layer«):
Je XML datoteka, ki preslikuje entitete in povezave definirane v entitetni plasti z dejanskimi
povezavami in tabelami definiranimi v logični plasti.
STORITVE METAPODATKOV (angl. »metadata services):
Zagotavlja centraliziran API za dostop metapodatkov shranjenih v entitetni, preslikovalni in
shranjevalni plasti.
SISTEM ZA PRESLIKAVO (angl. »mapping engine«):
Izvaja preslikavo med spremembami na entitetnem objektu in operacijami na pripadajoči
tabeli v podatkovni bazi.
17
3.2.3 OBJEKTNE STORITVE
Objektne storitve (angl. »object service« plast je objektni kontekst (angl. »object context«),
ki predstavlja sejo interakcije med aplikacijo in virom podatkov. Glavna funkcionalnost
objektnega konteksta je izvajanje operacij (npr. dodajanje, brisanje) nad instancami entitet
in shranjevanje spremenjenih stanj nazaj na podatkovno bazo s pomočjo poizvedb.
Ta storitev omogoča razvijalcu uporabo širokega nabora funkcionalnosti, ki jih EF ponuja
(preslikava primarnega ključa, sledenje spremembam) s pisanjem poizvedb z uporabo LINQ
ali Entity SQL.
3.3 RAZVOJ ENTITY FRAMEWORKA
EF 3.5
Prva verzija Entity Frameworka je izšla leta 2008 in je bil vključen znotraj .NET 3.5 SP1
ogrodja in Visual Studia 2008. Ta izdaja je ponujala zgolj osnovne funkcionalnost O-RM
orodja z uporabo »database first« načinom razvoja. [17]
EF 4
Izdaja Entity Framework 4 je bila vključena v .NET 4 ogrodje in Visual Studio 2010. Nove
funkcionalnosti, ki jih EF omogoča, so bile podpora POCO razredom, »leno nalaganje« (angl.
»lazy loading«), izboljšana testabilnost, generiranje prilagojene kode in »model first« način
razvoja. Čeprav je bila to druga izdaja Entity Frameworka, so jo poimenovali EF4, da
sovpada z razvojem .NET ogrodja. [17]
EF 4.1
Po izdani tej verziji je EF postal samostojno orodje, ki ni bilo vezano na verzije .NET ogrodja.
Dostopen je bil preko NuGet orodja vključenega v Visual Studio, ki omogoča upravljanje s
18
paketi v projektu. Ta verzija vključuje »code first« način razvoja in poenostavljen API za
DbContext.
V verziji 4.1.1 so bili vključeni popravki skupaj z nekaterimi dodatnimi komponentami, ki
olajšajo delo načrtovanja pri »code first« načinu razvoja. [17]
EF 4.3
Dodana je ena izmed glavnih funkcionalnosti za »code first« način razvoja. V tej verziji je
bila dodana možnost migracij. To pomeni, da lahko avtomatsko spreminjamo model
podatkovne baze glede na model v aplikaciji.
V verziji 4.3.1 so vključeni popravki za verzijo 4.3. Izboljšana je tudi podpora za LocalDb za
razvijalce, ki uporabljajo EF verzije 4.3 v Visual Studio 2012. [17]
EF 5
Ta izdaja se lahko uporablja v Visual Studio 2010 in 2012 za razvoj aplikacij, ki temeljijo na
.NET 4 in 4.5 ogrodju. V .NET 4.5 ogrodju je zagotovljena podpora za enum tipe, tabelno-
vrednotene funkcije, prostorske podatkovne tipe in nekaj zmogljivostnih nadgradenj.
Z uporabo orodja Entity Framework načrtovalca v Visual Studio 2012, se EF5 namesti
samodejno v projekt in generira kodo, ki jo lahko uporabljamo. Prav tako imajo tudi vsi
ASP.NET projekti v Visual Studio 2012 imajo že privzeto nameščen EF5. [17]
EF 6
Verzija EF 6 se lahko uporablja pri razvoju aplikacij, ki temeljijo na .NET 4 in 4.5 ogrodju,
znotraj Visual Studia 2013, 2012 in 2010 (zgolj v času izvajanja). To je prva verzija, kjer je
celoten EF vključen v samostojno knjižnico, ki je dostopna preko upravljalca paketkov
NuGet. [17]
Nove funkcionalnosti, ki delujejo za modele, ustvarjene s »code first« pristopom in modele,
ustvarjene z EF načrtovalcem:
• asinhrone poizvedbe in shranjevanja,
• obnovitev seje, če se povezava prekine,
• možnost konfiguracije znotraj kode (prej preko config datoteke),
19
• izboljšana testabilnost,
• DbContext objekt je lahko ustvarjen znotraj DbConnectiona, ki je že odprt,
• izboljšana podpora za transakcije znotraj EF in dodana podpora za transakcije
zunaj ogrodja.
EF 6.1
Glavna prednost te verzije je zaznava spremembe modela ter izvajanje migracije. Ob
izboljšavi zmogljivosti EF so bile dodane tudi funkcionalnosti, kot so:
• dodajanje atributa [Index] na lastnost v modelu, ki generira indeks v podatkovni
bazi na izbranem stolpcu,
• omogoča obnovitev transakcije, ko pade povezava.
Trenutno zadnja produkcijska verzija je 6.1.3, v beta testiranju pa je od 19. maja, 2017 [18],
že 6.2.0.
RAZLIKA MED EF5 IN EF6
Glavni preskok v razvoju Entity Frameworka se je zgodil med verzijo 5 in 6. Do vključno
verzije 5 je bil v zunanji knjižnici le del celotnega ogrodja oziroma nekatere funkcionalnosti.
Jedro EF je bilo v .NET ogrodju (Slika 3.3). Jedro pa predstavlja vse poizvedbe, sledenje
spremembam, preslikava vrnjenih podatkov v objekte,…
Slika 3.3: Razlika med EF5 (levo) in EF6 (desno)
20
Za razliko od EF 5, je pri verziji 6 celotno ogrodje v zunanji knjižnici, dostopno preko NuGeta,
vključno z jedrom. To pomeni, da EF več ni odvisen od razvoja .NET ogrodja za zagotavljanje
specifičnih funkcionalnosti (npr. kot podpora enum).
3.4 PRISTOPI K RAZVOJU
Pri razvoju aplikacije z ogrodjem Entity Framework se ponujajo različni načini, kako
pristopiti k razvoju same aplikacije. Glede na to, kateri način bomo izbrali, je odvisno od
situacije v kateri smo. Glavna dejavnika, na podlagi katerih se odločimo za način razvoja,
sta, ali morda že imamo obstoječo podatkovno bazo, na podlagi katere bi želeli aplikacijo
razvijati, ter ali morda že imamo obstoječe razredi, na katerih bi želeli, da sloni aplikacija.
Entity Framework ponuja tri različne pristope za razvoj. [19]
3.4.1 CODE FIRST PRISTOP
EF je code first pristop k razvoju izdal z verzijo 4.1. Z uporabo tega pristopa se lahko
razvijalec osredotoči predvsem na domensko načrtovanje in začne z izdelavo razredov, ki
jih zahteva, namesto, da na podlagi podatkovne baze izdela razrede, ki se ujemajo s
strukturo podatkovne baze. Code first API nato iz izdelanih entitetnih razredov generira
podatkovno bazo.
Razvijalec začne z razvojem razredov (v jeziku C# ali VB.NET) in kontekstnega razreda. Ko
aplikacijo zaženemo, bo API znotraj EF, ki je pooblaščen za code first pristop, izdelal novo
podatkovno bazo, v primeru, da še ne obstaja. Izvedla se bo preslikava razredov v tabele z
uporabo privzete code first konvencije. Razvijalec ima nato možnost konfiguracije
domenskih razredov za spremembo privzete konvencije za preslikavo tabel v PB z uporabo
DataAnnotation atributa ali »fluent APIja« [19]
21
3.4.2 MODEL FIRST PRISTOP
Uporablja se, ko nimamo obstoječe podatkovne baze, ki bi predstavljala model. Pri tem
pristopu moramo najprej z uporabo Visual Studia oblikovati EDM model. Določimo entitete
in lastnosti, relacije med entitetami, omejitve. Tako dobimo hierarhijo dedovanja v
oblikovalcu EDM modela. Določimo tudi, katere lastnosti bodo predstavljale primarne
ključe, ter če podatkovna baza avtomatsko številči te zapise. Za izdelan model lahko nato
generiramo skripte, katere zaženemo na podatkovnem strežniku in kreirajo tabele glede na
izdelan model. Skripte vsebujejo SQL stavke, ki spadajo v kategorijo za definicijo podatkov
(angl. »Data Defnition Language« oz. DDL). Pomanjkljivost pri uporabi tega pristopa je, da
se ob spremembah na modelu samodejno ne posodablja tudi podatkovna baza. Ob
spremembi modela in ponovnem generiranju skript bo orodje generiralo vse tabele na
novo. S tem seveda izgubimo tudi vse že obstoječe podatke v podatkovni bazi. Zato je v
takšnem primeru priporočljiva uporaba varnostnih kopij podatkov ali uporaba zunanjih
orodij, ki olajšajo posodabljanje podatkovne sheme. [19]
3.4.3 DATABASE FIRST PRISTOP
Pristop, kjer iz obstoječe podatkovne baze generiramo model, obstaja že od samega
začetka razvoja Entity Frameworka. Razvoj EF je bil zgrajen prav okrog database first
pristopa. Ta omogoča, da obstoječo podatkovno shemo uvozimo v orodje za izgradnjo EDM
modela. Tak postopek imenujemo obratno inženirstvo (angl. »reverse engineering«). Je
najpreprostejša oblika pristopa. Postopek je tak, da preko čarovnika uvozimo obstoječo
podatkovno bazo, kjer označimo katere tabele, poglede in procedure želimo, da orodje za
izdelavo modela preslikava v dejanski EDM model.[19]
22
4 NHIBERNATE
NHibernate je izpopolnjeno orodje za objektno-relacijsko preslikavo, namenjeno za .NET
okolje. Poleg zagotavljanja preslikave iz .NET razredov v tabele v podatkovni bazi (in .NET
podatkovne tipe v SQL podatkovne tipe), NHibernate omogoča tudi poizvedovanje po
podatkih in druge funkcionalnosti, kar lahko znatno zmanjša čas , potreben za razvoj
aplikacije, za razliko od klasičnega ročnega upravljanja s podatki z uporabo SQL in ADO.NET.
Je aktivno v razvoju, polno funkcionalno in uporabljeno na tisočerih aplikacijskih projektih.
Zgrajen je na vrhu ADO.NET. Trenutno najbolj uporabljena verzija je 4.0.4, v produkciji pa
je tudi že 4.1.1. Zasnovan je na osnovi javanskega produkta Hibernate. [20]
Cilj ogrodja NHibernate je, da razvijalca razbremeni za 95% kode, ki je potrebna za
upravljanje podatkovnega sloja znotraj aplikacije. NHibernate ni namenjen za podatkovno
orientirane aplikacije, kjer je pogosta uporaba procedur za implementacijo poslovne logike
znotraj podatkovne baze. Najbolj je uporabno za objektno orientirane domenske modele
in poslovno logiko znotraj .NET ogrodja v srednjem nivoju. Kljub temu NHibernate pomaga
pri izbrisu ali zamenjavi kode, ki vsebuje specifične SQL stavke, kot tudi prenos rezultatov
in tabelarnega prikaza v grafični prikaz objektov. [21]
4.1 OSNOVNE FUNKCIONALNOSTI NHIBERNATA
V seznamu so naštete, poleg osnovnih O-RM funkcionalnost, glavne in največkrat
uporabljene funkcionalnosti ter lastnosti NHibernata:
• podpora številnim podatkovnim bazam,
• fleksibilne strategije za preslikave,
• razvojno okolje za neprekinjeno integracijo,
• fleksibilni poizvedovalni API-ji,
• podpora za zapis dnevnikov,
• podpora za procedure in prožilce (angl. »triggers«),
• zmožnost seje brez stanja,
• direktna manipulacija s podatki,
23
• več možnosti medpomnjenja,
• serijske SQL poizvedbe (angl. »batch SQL«),
• podpora za sestavljene ključe,
• lastni podatkovni tipi,
• dvosmerne asociacije,…
4.2 ARHITEKTURA NHIBERNATE
NHibernate je zelo fleksibilen in podpira različne načine uporabe. Prvi izstopajoči je s tako
imenovano »lite« arhitekturo (Slika 4.1), ki sam zagotavlja ADO.NET povezavo in sam
upravlja s transakcijami. Ta pristop uporablja minimalen nabor API-jev, ki jih NHibernate
ponuja. [22]
Slika 4.1: "Lite" arhitektura NHibernate [22]
Tako imenovana polna arhitektura (Slika 4.2) (angl. »full cream architecture«), se umakne
od ADO.NET API-jev in prepusti NHibernatu, da prevzame odgovornost za podrobnosti.
24
Slika 4.2: "Full cream" arhitektura NHibernate [22]
Razlaga objektov iz polne arhitekture NHibernate:
TOVARNA SEJ (angl. »session factory«)
Varen (nespremenljiv) predpomnilnik iz prevedenih preslikav za eno podatkovno bazo.
Tovarna za objekt seje (ISession) in odjemalec objekta ponudnika povezave
(IConnectionProvider). Lahko uporablja tudi opcijski (drugo-nivojski) predpomnilnik
podatkov, ki jih lahko ponovno uporabimo med transakcijami na nivoju procesa ali grozda.
SEJA (angl. »session«)
Enojni, kratkotrajni objekt, ki predstavlja komunikacijo med aplikacijo in trajno shrambo.
Ovije ADO.NET povezavo. Je tovarna za transakcije (ITransaction). Ima obvezen (prvo-
nivojski) predpomnilnik iz obstoječih objektov, ki se uporabljajo za navigacijo nad objektom
in poizvedbe po objektih glede na identifikacijski ključ.
25
PERSISTENČNI/STALNI OBJEKTI IN ZBIRKE (angl. »persistent objects and collections«)
Enojni, kratkotrajni objekti, ki vsebujejo trajno stanje in poslovno funkcijo. To so lahko
običajno POCO razredi. Edina posebna stvar o njih je, da so trenutno povezani z (natančno
eno) sejo (ISession). Takoj, ko se seja zapre, bodo ločeni in prosto uporabni v vseh plasteh
aplikacije (npr. direktno, kot prenos objektov v predstavitev in iz nje).
PREHODNI OBJEKTI IN ZBIRKE (angl. »transient objects and collections«)
So instance prehodnih razredov, ki trenutno niso povezani s sejo (ISession). Lahko so
instancirani s strani aplikacije in (še) niso stalni (persistenčni), lahko pa so bili instancirani s
strani seje (ISession), ki se je že zaprla.
TRANSAKCIJA (angl. »transaction«)
Neobvezen, enojni in kratkotrajni objekt, ki ga aplikacija uporablja za definicijo atomskih
enot dela. Seja lahko ima v določenih primerih več transakcij.
PONUDNIK POVEZAVE (angl. »connection provider)
Neobvezen, tovarna za ADO.NET povezave in komande. Ni izpostavljen aplikaciji, ampak ga
lahko razvijalec podaljša/implementira.
TOVARNA TRANSAKCIJ (angl. »transcaction factory«)
Neobvezen, tovarna za instance objekta transakcije (ITransaction). Ni izpostavljena
aplikaciji, ampak jo lahko razvijalec podaljša/implementira. [21]
4.2.1 STANJE OBJEKTOV PERSISTENČNIH RAZREDOV
Objekt trajnega razreda je lahko v eni od treh različnih stanj, ki so opredeljeni glede na
persistentni kontekst (objekt seje - ISession): [21]
26
• PREHODNO (angl. »transient«) - instanca ni in nikoli ni bila povezana s katerimkoli
persistentnim kontekstom. Nima persistentne identitete (primarne vrednosti
ključa),
• PERSISTENTNO (angl. »persistent«) - instanca je trenutno povezana s
persistentnim kontekstom. Ima persistentno identiteto in najbrž tudi pripadajočo
vrstico v tabeli. Za določen persistentni kontekst, NHibernate zagotavlja, da je
persistentna identiteta enaka CLR identiteti (v pomnilniški lokaciji objekta),
• LOČENO (angl. »detached«) - instanca je bila včasih povezana z persistentnim
kontekstom, a je ta bil zaprt, ali pa je bila instanca serializirana drugemu procesu.
Ima persistentno identiteto in najbrž pripadajoči vrstico v tabeli. Za ločene
instance NHibernate ne zagotavlja povezave med persistentno identiteto in CLR
identiteto.
4.3 RAZVOJ NHIBERNATE
NHibernate je razvil Tom Barrett, kasneje pa sta projekt prevzela Mike Doerfler in Peter
Smulovics. Konec leta 2005 je takratno podjetje JBoss (trenutno Red Hat) najelo Sergeya
Koshcheyeva, kasnejšega vodja razvoja NHibernata, za polni delovni čas na razvoju tega
produkta. Leta 2006 je podjetje JBoss prenehalo s podporo projektu. Trenutno je vodenje
in razvoj prepuščeno skupnosti. [20]
NHIBERNATE 1.0
Prva verzija NHibernata je ponujala celoten nabor funkcionalnosti, ki jih je vseboval javanski
različica Hibernate 2.1. Prav tako je bilo vključenih nekaj funkcionalnosti iz takratne zadnje
Hibernate verzije 3.
Verzija 1.2.1, ki je izšla novembra, leta 2007, je predstavila veliko dodatnih funkcionalnosti
povzetih iz Hibernate 3 in podporo za .NET ogrodje verzije 2.0. Dodana je bila podpora za
procedure, generike in null tipe.
27
NHIBERNATE 2.0
Verzija 2 je izšla avgusta leta 2008. Je popolnoma enakovredna s takratno Hibernate verzijo
3.2 (v smislu nudenja funkcionalnosti). Z izdajo te verzije je NHibernate opustil podporo za
.NET 1.1.
Verzija 2.1 je bila izdana julija 2009.
NHIBERNATE 3.0
Tretja verzija orodja je izšla decembra 2010, s čimer je bila tudi prva verzija, ki je uporabljala
.NET ogrodje verzije 3.5. V omenjeno verzijo spadajo funkcionalnosti kot so:
• integrirana podpora za LINQ,
• močno tipiziran API imenovan QueryOver,
• podpora za leno nalaganje (angl. »lazy loading«) kolon.
NHIBERNATE 3.2
Izdan aprila 2011, z dodanimi več funkcionalnostmi, med katerimi izstopata:
• preslikava s kodo: tekoča konfiguracija, .hbm.xml datoteke več niso potrebne,
• podskupina: možnost prikaza SQL pogledov kot entitete.
NHIBERNATE 4.0
Četrta, aktualna verzija NHibernate, je bila izdana avgusta leta 2014, v kateri se je še bolj
uveljavila tako imenovana tekoča konfiguracija (»Fluent configuration«). Verzija je bila
poimenovana tudi Fluent NHibernate, ki bistveno prestavi konfiguracijo preslikave iz
zunanjih datotek v programski jezik C#.
Dodana je tudi podpora za .NET ogrodje verzije 4 in SQL Server 2012. Izboljšane so bile že
obstoječe funkcionalnosti za:
• zaganjanje serijskih SQL-ov (angl. »batch SQL«) za MySql podatkovno bazo,
• podpora za uvažanje razredov v preslikave,
• hitrost LINQ poizvedb zmanjšana za do 50% časa,
• podpora PostgreSQL trigonometričnim funkcijam.
28
5 UPORABA FUNKCIONALNOSTI NA PRAKTIČNEM PRIMERU
Za prikaz funkcionalnosti, ki jih bomo želeli prikazati, smo si izbrali preprost osnovni model,
ki ga najdemo v trgovinah. Izdelali bomo model na osnovi fiktivne trgovine, ki sestoji iz
glavnih entitet:
• Stranka,
• Račun,
• Postavka,
• Izdelek
E-R DIAGRAM MODELA:
Slika 5.1: E-R diagram modela
Entiteta »Stranka« ima lastnosti ime, priimek, naslov in pošta številka. Predpostavili bomo,
da so stranke zgolj fizične osebe, od katerih se ne zahteva davčna številka in druge
podrobnosti. »Racun« nosi tuji ključ entitete »Stranka« ter datum, kdaj je bil račun izdan.
Entiteta »Postavka« ima podatek za vsako postavko na računu, zato ima tuji ključ računa.
»Postavka« ima tudi tuji ključ izdelka, ki ga je stranka izbrala, količino izbranega izdelka ter
29
skupni znesek postavke. »Izdelek« ima naziv izdelka, ceno izdelka in povezavo na entiteto
»TipIzdelka« z njegovim tujim ključem. Ta vsebuje zgolj naziv tipa izdelka.
5.1 UPORABA ENTITY FRAMEWORK
5.1.1 PRIPRAVA RAZVOJNEGA OKOLJA
Najprej bomo v programu Visual Studio 2015 izdelali novi projekt namenjen razvoju
primera na osnovi ogrodja Entity Framework. Za testni prikaz funkcionalnosti smo izbrali
konzolno aplikacijo, katero smo poimenovali »PrimerEF«. Nastavili smo, da bo primer razvit
v ogrodju .NET verzije 4.5.2.
Ko je projekt ustvarjen, imamo dve možnosti, kako vpeti ogrodje Entity Framework v na
novo ustvarjeno okolje.
1. Preko orodja NuGet, ki vodi nameščene paketke (angl.«packages«) v projektu.
2. Preko orodja Package Manager Console, kjer vpišemo željen ukaz, orodje pa
namesto nas izvede namestitev paketka, ki ga želimo v projektu.
Po namestitvi EF je okolje za nadaljevanje razvoja pripravljeno. V nadaljevanju bomo
prikazali izdelavo modela z uporabo različnih pristopov, ki jih ponuja Entity Framework.
5.1.2 IZDELAVA MODELA
CODE-FIRST PRISTOP
Kot smo omenili že v zgornjem delu diplomskega dela, je pristop code-first najbolj razširjen
in tudi najbolj uporaben, če se lotimo razvoja aplikacije »iz nič«, torej brez predhodno
obstoječe podatkovne baze in aplikacijske logike. Izdelamo si razrede, katere nato
preslikamo v tabeli na podatkovni bazi.
30
Programska koda 5.1: Definicija razreda "Racun"
Za tem, ko definiramo vse potrebne razrede (v našem primeru »Racun«, «Stranka«,
«Izdelek«, »TipIzdelka« in »Postavka«), napišemo še kontekstni razred, kamor vključimo
sezname razredov, ki jih želimo v podatkovni bazi. Kontekstni razred omogoča konfiguracijo
dodatnih nastavitev. Da lahko Entity Framework dostopa do podatkovnega strežnika,
potrebuje povezavni niz (angl. »connection string«). Ta mu pokaže pot do strežnika, kjer
želimo, da je podatkovna baza locirana. Connection string (Programska koda 5.2) vnesemo
znotraj datoteke App.config.
Programska koda 5.2: Connection string, ki kaže pot do podatkovnega strežnika
Ko je model pripravljen, lahko zaženemo ukaz (Programska koda 5.2) za izdelavo
podatkovne baze na podlagi modela. Ukaz vzpostavi okolje na podatkovnem strežniku.
Programska koda 5.3: Ukaz, ki generira podatkovno bazo na podlagi modela
MODEL-FIRST PRISTOP
Drugi način, kako lahko izdelamo model, je z uporabo model-first pristopa. To storimo tako,
da preko orodja, ki ga ponuja Visual Studio, v projektu dodamo nov element, poimenovan
ADO.NET Entity Data Model. V čarovniku, ki se nato prikaže(Slika 5.2) izberemo Empty EF
Designer model, kar bo odprlo prazen načrtovalec za EDM model.
31
Slika 5.2: Čarovnik za dodajanje novega elementa EDM
V načrtovalec smo nato dodali vseh 5 entitet, ki jih želimo v aplikaciji. Vsaki entiteti smo
nato dodali skalarne lastnosti, ki bodo nosile podatke. Določili smo jim podatkovne tipe.
Prav tako smo dodali asociacije med entitetami, čigar rezultat so bile dodane navigacijske
lastnosti v entitete.
32
Slika 5.3: EDM model za primer trgovine s skalarnimi in navigacijskimi spremenljivkami
Visual Studio EDM načrtovalec omogoča generiranje entitetnih razredov in kontekstnega
razreda iz izdelanega modela. To storimo z dodajanjem novega elementa k modelu.
Imenuje se Code Generation Item. Ta ob pravilni konfiguraciji lastnosti v modelu ustvari
identične razrede (Slika 5.4), kot smo jih sami pri code-first pristopu. Ustvari se tudi
kontekstni razred.
Slika 5.4: Izdelani razredi z uporabo EDM modela
33
DATABASE-FIRST PRISTOP
Ker ta pristop k razvoju od nas že zahteva obstoječo podatkovno bazo, bomo prikazali
uporabo pristopa s pomočjo že izdelane podatkovne baze iz prvega prikazanega pristopa
(code-first).
To storimo tako, da v projektu dodamo novi element, imenovan ADO.NET Entity Data
Model. Za razliko od model-first pristopa, kjer smo uporabili prazno predlogo, tukaj v
čarovniku izberemo EF designer from database, kar pomeni, da bomo zgradili model na
osnovi obstoječe podatkovne baze.
Za tem se prikaže okno, kjer lahko dodamo podatkovno bazo (.mdf), ali jo izberemo na
podlagi povezave do podatkovnega strežnika. Vnesli smo pot do podatkovne baze iz prvega
primera. Sledi izbira elementov (Slika 5.5), ki jih želimo uvoziti v model. Omogoča uvoz
pogledov, tabel, procedur in funkcij. Izbrali bomo vseh 5 tabel.
Slika 5.5: Izbira objektov, ki jih želimo v modelu iz PB
34
Po uvozu podatkovne baze se izriše model (Slika 5.6) na podlagi obstoječe podatkovne
baze. Prav tako se generirajo entitetni razredi potrebni za model.
Slika 5.6: Model generiran na osnovi obstoječe podatkovne baze
Visaul Studio EDM načrtovalec v datoteko App.config doda oznako za connection string,
čemur sledi, da je projekt pripravljen na povezovanje s podatkovno bazo.
5.1.3 OSNOVNE CRUD OPERACIJE
Delovanje Entity Frameworka bomo prikazali na osnovnih CRUD metodah, ki vsebujejo:
• Create metodo (izdela vrstico/vrstice),
• Read metodo (prebere vrstico/vrstice),
• Update metodo (posodobi vrstico/vrstice),
• Delete metodo (izbriše vrstico/vrstice).
35
Vse metode bomo prikazali na primeru, kjer najprej izdelamo kontekstni objekt z uporabo
using izjave. Razlog za uporabo takšnega pristopa je, da kontekstnemu objektu zagotovimo,
da bo odstranjen (angl. »disposed«), takoj ko pride iz definiranega področja uporabe (angl.
»scope«). S tem se rešimo potrebnega pisanja kode za ročno odstranjevanje konteksta.
Pri funkciji, kjer vrnemo seznam vseh izdelkov (Programska koda 5.4), smo uporabili
kontekstni objekt. Kot smo definirali v pripadajočem kontekstnem razredu, imamo nabor
izdelkov poimenovan »seznamIzdelkov«, katerega smo z uporabo LINQ funkcije ToList()
pretvorili v seznam izdelkov. Ker smo lastnost »TKIDTipIzdelka« na razredu »Izdelek«
definirali z rezervirano besedo virtual, se bo objekt naložil v objekt po principu lazy loading.
Ker želimo seznam izdelkov uporabljat po zaprtju odprtega konteksta, moramo nalaganje
objekta spremeniti v t.i. takojšnje nalaganje (angl. »eager loading«). To storimo z uporabo
Include funkcije znotraj imenskega prostora System.Data.Entity, kjer podamo preko
navigacijske poti pot do objekta, katerega želimo imeti v trajnem seznamu izdelkov.
Programska koda 5.4: Funkcija, ki vrne vse objekte tipa "Izdelek" iz PB
Za dodajanje nove vrstice (Programska koda 5.5) v podatkovni bazi moramo najprej ustvari
nov objekt razreda. Zato smo definirali metodo, kjer znotraj uporabe kontekstnega objekta
kreiramo nov objekt razreda ter mu priredimo vrednosti. Nov objekt nato dodamo v
seznam v kontekstu ter potrdimo s shranjevanjem na podatkovno bazo.
36
Programska koda 5.5: Metoda, ki doda novi objekt tipa "Izdelek" v PB
Metoda za posodabljanje izdelka (Programska koda 5.6) dobi objekt kot parameter v
metodo. Nato z objektom konteksta preko ID izdelka pridobimo pripadajoči izdelek, ki bo
vezan na odprt kontekst. Na novo pridobljenemu objektu lahko spremenimo vrednosti.
Metoda se zaključi s shranjevanjem sprememb na podatkovno bazo.
Programska koda 5.6: Metoda, ki posodobi objekt tipa "Izdelek" v PB na podlagi para metra
Pri metodi za izbris izdelka (Programska koda 5.7) iz podatkovne baze je postopek podoben
kot pri posodabljanju. Najprej moramo izbran izdelek ponovni pridobiti, da ga vežemo na
odprt kontekstni objekt. Nato ga s funkcijo Remove() izbrišemo iz konteksta ter z ukazom
SaveChanges() potrdimo izbris na podatkovni bazi.
37
Programska koda 5.7: Metoda, ki izbriše objekt tipa "Izdelek" v PB
5.1.4 SHRANJENE PROCEDURE
Ker bi naj O-RM tehnologija nadomeščala klasične nastope dostopa do podatkov, je
potrebno v to všteti tudi zagotavljanje takšnih funkcionalnosti, kot je na primer klic stored
procedure. Entity Framework omogoča klice procedur, ki so shranjene v podatkovni bazi.
Za naš primer smo na SQL strežniku izdelali novo proceduro, poimenovano
»GetIzdelkiGledeNaTip«, ki kot parameter sprejme ključ tipa izdelka. Ta nato vrne rezultate
na podlagi izvršenega SQL stavka znotraj procedure na strežniku. Napisali smo metodo
(Programska koda 5.8), kjer z uporabo objekta kontekstnega razreda pridobimo objekt tipa
izdelka. Nato izdelamo novi SqlParameter, ki ga poimenujemo ter mu določimo vrednost.
Sledi klic SQL stavka, kjer navedemo rezervirano besedo exec, ki sproži proceduro
navedeno v nadaljevanju niza z imenom parametra.
Programska koda 5.8: Izvrševanje procedure z uporabo EF
38
5.1.5 LINQ
Poizvedbe v podatkovno bazo so z uporabo Entity Frameworka izvedene s tako imenovanim
LINQ to Entities pristopom. Ponuja LINQ podporo, ki omogoča razvijalcem pisanje poizvedb
glede na izdelan konceptualni model preko Entity Frameworka z uporabo enega izmed .NET
programskih jezikov. LINQ to Entities pretvarja LINQ poizvedbe v komandne poizvedbe, ki
se s pomočjo Entity Frameworka izvedejo in vrnejo objekte. Omogoča poizvedovalno
sintakso (angl. »query syntax«) in metodično sintakso (angl. »method syntax«).
POIZVEDBE PO VSEH PODATKIH
Poizvedba po vseh podatkih določenega tipa (Programska koda 5.9) je najpreprostejša
oblika poizvedbe, ki jo lahko napišemo. Sledeči primer izpiše vse stranke v tabeli »Stranka«.
Programska koda 5.9: Query sintaksa (levo) in method sintaksa (desno) za izpis vseh strank
FILTRIRANJE REZULTATOV POIZVEDBE
Funkcija Where() se uporablja (Programska koda 5.10), da pridobimo samo določene
podatke iz podatkovne baze. Pomen je precej podoben rezervirani besedi where v SQL
poizvedbah.
Programska koda 5.10: Query sintaksa (levo) in method sintaksa (desno) za pogojni izpis
39
SORTIRANJE REZULTATOV POIZVEDBE
Sortiranje se izvede z uporabo metode OrderBy. Z uporabo rezervirane besede descending
se razvrsti padajoče, sicer je po privzeto naraščajoče. Prav tako je mogoče sortirati rezultate
po več kriterijih in sicer z uporabo ThenBy() metode, kjer definiramo nadaljevanje
sortiranja.
Programska koda 5.11: Query sintaksa (levo) in method sintaksa (desno) za sortiran izpis
5.2 UPORABA NHIBERNATE
5.2.1 PRIPRAVA RAZVOJNEGA OKOLJA
Tako kot smo omenili pri teoretičnem opisu ogrodja NHibernate, je z verzijo 4.0 prišla
dodadna funkcionalnost, ki je omogočala konfiguracijo in preslikave z uporabo strogo
tipiziranega jezika C#. Tako se nastavitve obnašanja in preslikav seli iz XML dokumentov v
programski jezik. Ta način bomo uporabili tudi pri prikazu funkcionalnosti na projektu.
V Visual Studio 2015 bomo izdelali novi projekt, za katerega smo izbrali konzolno aplikacijo,
ter ga poimenovali »PrimerNHibernate«. Tako kot EF bomo tudi to ogrodje uporabljali v
ogrodju .NET 4.5.2.
Ko je projekt ustvarjen, imamo dve možnosti, kako vpeti ogrodje NHibernate v na novo
ustvarjeno okolje.
1. Preko orodja NuGet, ki vodi nameščene paketke (angl.«packages«) v projektu.
2. Preko orodja Package Manager Console, kjer vpišemo željen ukaz, orodje pa
namesto nas izvede namestitev paketka, ki ga želimo v projektu.
Ker je Fluent NHibernate le zgornji sloj celotnega ogrodja, bo orodje za namestitve
paketkov samodejno namestilo osnovni NHibernate.
40
Po namestitvi je okolje za nadaljevanje razvoja pripravljeno. V nadaljevanju bomo prikazali
izdelavo modela z uporabo različnih pristopov, ki jih ponuja NHibernate.
5.2.2 IZDELAVA MODELA
CODE-FIRST
NHibernate privzeto omogoča uporabo tako imenovanega code-first pristopa, ki je že znan
iz EF. Tukaj je razlika takšna, da NHibernate sam ne izdela podatkovne baze, generira pa
tabele v podatkovni bazi ter vse ključe, ki jih zapišemo v preslikovalnih datotekah.
Najprej smo izdelali razrede (Programska koda 5.12) na osnovi entitetno-relacijskega
diagrama, ki smo ga prikazali na Slika 5.1, ki predstavljajo model. Za uporabo modela z
NHibernate se mora vsaka lastnost v razredu označiti z rezervirano besedo virtual, kar
omogoča, da se objekt v pomnilnik naloži po principu »lazy loadinga«.
Programska koda 5.12: Definicija razreda "Stranka"
Bistvena razlika/prednost napram Entity Frameworku je ta, da se razvijalcu popolnoma
prepusti konfiguracija, ki je potrebna za definicijo preslikav med relacijsko podatkovno bazo
in objekti v programskem jeziku. Zato je potrebno za vsak definiran razred spisati tudi
pripadajoči preslikovalni razred (angl. »map class«). Tam določimo katera lastnost v
razredu modela je primarni ključ, kateri stolpec se preslikuje v kateri podatkovni tip,…
41
Programska koda 5.13: Konfiguracija preslikave »Stranka« (levo) in »Racun« (desno)
Ko imamo vse potrebne razrede za model in pripadajoče preslikovalne razrede, je model za
delo pripravljen. Ker NHibernate ne podpira izdelave podatkovne baze, jo mora razvijalec
v naprej izdelati ročno na podatkovnem strežniku. V connection string se nato zavede ime
podatkovne baze. Izdelati je potrebno metodo (Programska koda 5.14), ki za podatkovno
bazo in model na podlagi podanega connection string-a generira pripadajoče tabele in
omejitve.
Programska koda 5.14: Metoda za generiranje tabel in pravil v podatkovni bazi
DATABASE-FIRST
Visual Studio v osnovi ne podpira podobnega načrtovalca za NHibernate model, kot to
počne za EF. Obstajajo pa ločene rešitve, kjer povežemo izbrano rešitev z podatkovno bazo,
orodje pa samodejno generira razrede za model in razrede za preslikavo. Eno izmed takšnih
42
orodij je NHibernate Mapping Generator, ki je prosto dostopno na spletu. Prav tako ponuja
možnost sprememb na samih tabelah ter določanje njenih tipov, null vrednosti, ključev,…
Slika 5.7: Orodje, ki omogoča razvoj po principu database-first
5.2.3 OSNOVNE CRUD OPERACIJE
Delovanje NHibernata bomo prikazali na osnovnih CRUD metodah, ki vsebujejo:
• Create metodo (izdela vrstico/vrstice),
• Read metodo (prebere vrstico/vrstice),
• Update metodo (posodobi vrstico/vrstice),
• Delete metodo (izbriše vrstico/vrstice).
Vse metode bomo prikazali na primeru, kjer najprej izdelamo objekt seje z uporabo using
izjave. Razlog za uporabo takšnega pristopa je, da objektu seje zagotovimo, da bo
odstranjen (angl. »disposed«), takoj ko pride ven iz definiranega področja uporabe (angl.
»scope«). S tem se rešimo potrebnega pisanja kode za ročno odstranjevanje konteksta.
Pri funkciji, kjer vrnemo seznam vseh računov (Programska koda 5.15Programska koda 5.4),
smo z uporabo SessionFactory odprli novo sejo. Znotraj seje pa smo funkcijo ovili še v
transakcijo. S tem zagotovimo, da se podatki ne morejo spremeniti v času, ko jih obdeluje
funkcija. Račune smo pridobili z uporabo funkcije CreateCriteria, kjer ji določimo tip (torej
43
tabelo v podatkovni bazi), po katerem želimo iskati. Razrede smo si zasnovali, da v osnovi
uporabljajo princip lazy loadinga, kar v primeru, ko želimo seznam uporabljati po zaprtju
seje, ne pride v poštev. Zato moramo eksplicitno navesti, da želimo, da se objekt naloži v
pomnilnik takoj, dokler še je seja odprta. Transakcijo potrdimo in vrnemo rezultat.
Programska koda 5.15: Funkcija, ki vrne seznam računov
Za dodajanje novega elementa (Programska koda 5.16) v podatkovni bazi smo znotraj seje
in znotraj transakcije izdelali objekt razreda »Racun«. Nato smo z uporabo Get() funkcije,
ki kot parameter sprejme ID objekta, pridobili stranko, na katero želimo vezati nov račun.
Nov račun smo nato shranili na sejo in potrdili transakcijo. Nov element je nato viden v
podatkovni bazi.
Programska koda 5.16: Metoda, ki doda nov račun
44
Metoda za posodabljanje računa (Programska koda 5.17) dobi objekt kot parameter v
metodo. Nato znotraj odprte seje in transakcije pridobimo objekt, katerega vežemo na
trenutno odprto sejo. Dobljenemu objektu nato priredimo vrednosti, katere nosi vhodni
parameter. Z Metodo Update() se shrani sprememba na podatkovno bazo.
Programska koda 5.17: Metoda za posodabljanje računa
Pri delete metodi (Programska koda 5.18) gre za podoben način kot pri posodobitvi. Najprej
moramo objekt, ki ga dobimo kot parameter vezati na trenutno odprt objekt. Zato moramo
s poizvedbo pridobiti objekt iz podatkovne baze. Objekt nato z metodo Delete() izbrišemo
iz podatkovne baze. Metoda se zaključi s potrjevanjem transakcije.
Programska koda 5.18: Metoda za izbris računa
45
5.2.4 SHRANJENE PROCEDURE
Tako kot večina sodobnih O-RM tehnologij, tudi NHibernate nudi podporo za izvajanje
shranjenih procedur, ki se nahajajo v podatkovni bazi. Izvede se z uporabo funkcije
CreateSQLQuery, kateri kot parameter podamo ime procedure (Programska koda 5.19).
Dodati moramo tudi parameter, ki se pošlje skupaj s klicem. Na koncu poizvedbe je treba
dopisati, v kateri tip objekta se rezultat transformira.
Programska koda 5.19: Klic procedure, ki vrne seznam računov določene stranke
Kot vidimo na zgornjem primeru, je v podatkovni bazi procedura, ki kot parameter sprejme
tuji ključ stranke. Nato se s SQL stavkom v proceduri izvede poizvedba, ki vrne seznam
računov določene stranke.
5.2.5 LINQ
Bistvena funkcionalnost, ki jo NHibernate nudi, je podpora za poizvedbe na podlagi LINQ
sintakse. Uporablja se preko razširitvene metode na objektu seje z besedo Query<T>, kjer
je T model (tabela), po kateri želimo uporabljati poizvedbo. Poznamo dve sintaksi uporabe
LINQ (podobno kot pri EF) in sicer:
• sintaksa za verižne poizvedbe - metodična (NHibernate poimenuje »query
chaining syntax«),
• sintaksa za razumljivejšo poizvedbo - poizvedovalna (NHibernate poimenuje
»query comprehension syntax«).
46
POIZVEDBE PO VSEH PODATKIH
Poizvedba po vseh podatkih določenega tipa (Programska koda 5.20) je najpreprostejša
oblika poizvedbe, ki jo lahko napišemo. Sledeči primer izpiše vse stranke v tabeli »Stranka«.
Programska koda 5.20: Query sintaksa (levo) in method sintaksa (desno) za izpis računov
FILTRIRANJE REZULTATOV POIZVEDBE
Funkcija Where() se uporablja (Programska koda 5.21), da pridobimo samo določene
podatke iz podatkovne baze. Pomen je precej podoben rezervirani besedi where v SQL
poizvedbah.
Programska koda 5.21: Query sintaksa (levo) in method sintaksa (desno) za pogojni izpis
47
6 PRIMERJAVA EF IN NHIBERNATE
6.1 PODPORA RAZLIČNIM SUPB
Obe ogrodji se ponašata z zelo širokim naborom podpore sistemom za upravljanje s
podatkovnimi bazami. Razvijalci obeh ogrodij zagotavljajo, da sta sistema popolnoma
podprta za vse znane relacijske podatkovne baze. Za razliko od NHibernate, EF z najnovejšo
verzijo, namenjeno ASP.NET Core sistemom (imenovan Entity Framework Core), zagotavlja
podporo tudi ne-relacijskim podatkovnim bazam (NoSql podatkovne baze). [23]
6.2 PRESLIKAVA PODATKOVNIH TIPOV
Prikazali bomo, kako različno/podobno preslikata podatkovne tipe Entity Framework in
NHibernate na podatkovni strežnik Microsoft SQL Server.
.NET C# EF v MSSQL NHIBERNATE v MSSQL
Byte tinyint tinyint
Int32 int int
Int16 smallint smallint
Int64 bigint bigint
Single real real
Double float float
Char Ne podpira Nchar(1)
Boolean bit bit
String nvarchar(MAX) Nvarchar(255)
Decimal decimal(18,2) Decimal(19,5)
Byte[] varbinary(MAX) varbinary(MAX)
DateTime datetime datetime
DateTimeOffset datetimeoffset(7) datetimeoffset(7)
TimeSpan time(7) bigint
Tabela 6.1: Preslikava .NET podatkovnih tipov v MS SQL Server z obema tehnologijama
48
6.3 PRIMERJAVA FUNKCIONALNOSTI
Primerjamo dve najbolj znani in uporabljeni O-RM ogrodji v .NET okolju, zato bistvenih
razlik, kar se tiče funkcionalnosti praktično ni. Kljub temu, pa obstajajo nekateri aspekti,
kjer sta si precej različna. To poglavje bo namenjeno primerjavi posameznih funkcionalnosti
med njima.
PRESLIKAVE (angl. »mappings«)
Oba nudita podporo za uporabo POCO razredov, ki predstavljajo entitete. NHibernate
omogoča tri vrste preslikave:
• XML osnovano, katere prednost je, da entitetnega razreda ne vežemo na določeno
O-RM ogrodje, prav tako so te datoteke lahko nameščene kot datoteke na
datotečnem sistemu,
• atributno osnovano kjer držimo tako entitete kot podrobnosti podatkovne baze na
enakem mestu. Slabost je nasičenje entitetnih razredov z NHibernate specifičnimi
atributi,
• strogo tipizirano na osnovi kode, kar omogoča dinamično kreacijo modela, kar
odraža samodejne spremembe na preslikovalnih datotekah ob spremembi
modela.
Na drugi strani Entity Framework omogoča dve: [24]
• atributno osnovano (kljub temu atributi ne morejo izraziti vseh možnosti
nastavitev podatkovne baze, npr. omejitve (angl. »cascading«)),
• strogo tipizirano na osnovi kode.
POVEZAVE (angl. »associations«)
Kar se tiče povezav, imata tako EF kot NHibernate podporo za povezave ena proti mnogo,
ena proti ena in mnogo proti mnogo. Kljub temu NHibernate ponuja precej več zbirk: [25]
• vreča entitet ali vrednosti (ne sortirano, možnost duplikatov),
• seznam entitet ali vrednosti (sortirano, indeksirano s številčnim stolpcem),
• zemljevidi entitet ali vrednosti (indeksirano z entiteto ali katerokoli vrednostjo),
• nabori entitet ali vrednosti (ne sortirano, brez duplikatov),
• polja entitet ali vrednosti (indeksirano, nespremenljivo).
49
POIZVEDBE (angl. »querying«)
NHibernate omogoča precej večje številko poizvedovalnih API-jev: [26]
• LINQ - največkrat uporabljen,
• Hibernate poizvedovalni jezik (HQL) - objektno orientiran, podoben SQL-u, na voljo
od začetka razvoja NHibernata. Najbolj napreden ponudnik poizvedb, ustreza
dinamičnim poizvedbam (tudi z uporabo sestavljenih nizov),
• kriterijski API (angl. »Criteria API«) je konceptualna predstavitev poizvedbe, ki se
izvede s pomočjo modela razreda. Dobro deluje tudi za dinamične poizvedbe.
• Query Over je podoben kriterijskemu API-ju, s to razliko, da ta uporablja strogo
tipizirane LINQ izraze, namesto nizov,
• SQL (vključno s procedurami),
• možnost integracije z zunanjimi orodji za pisanje poizvedb.
Na drugi strani EF ponuja precej bolj skop napor API-jev za poizvedbe: [26]
• LINQ to Entities s polno podporo, večina razvijalcev uporablja tak način pisanja
poizvedb,
• Entity SQL, podobno kot HQL, omogoča objektno-orientirane poizvedbe,
neodvisne od podatkovne baze dinamične izraze,
• SQL (vključno s procedurami).
PREDPOMNJENJE (angl. »caching«)
Oba ponujata prvo-nivojsko pred pomnjenje. NHibernate ponuja tudi drugo-nivojsko, ki se
lahko uporablja z več objekti ISessionFactory, kot tudi različnimi sistemi za pred pomnjenje,
npr.: [25]
• Hashtable (v pomnilniku),
• SysCache (uporablja ASP.NET ponudnik predpomnilnika),
• Prevalence,…
GENERIRANJE ID-JEV (angl. »ID Generators«)
Entity Framework ponuja zgolj tri možnosti:
• GUID,
• dodeljene vrednosti,
• identiteta.
50
Na drugi strani NHibernate ponuja širok spekter strategij s strani podatkovne baze in drugo:
• identiteta (za podatkovne baze, ki podpirajo identitetne stolpce),
• sekvence (za podatkovne baze, ki podpirajo sekvence),
• na osnovi prožilca,
• več GUID pristopov (tudi v obliki niza),
• tabela ID-jev,
• združeno (angl. »pooled«),…
LASTNOSTI (angl. »properties«)
NHibernate podpira lastnosti entitetnih tipov (ena proti ena ali mnogo proti ena), zbirk (ena
proti mnogo ali mnogo proti mnogo), kot tudi skalarnih in naštevalnih tipov. Ponuja
mehanizem za generiranje kompleksnih tipov iz podatkovne baze, kateri celo ponujajo
podporo za poizvedbe. Na drugi strani Entity Framework omogoča podporo za zbirke,
entitetne tipe, skalarne in naštevalne. Ne omogoča mehanizma za generiranje kompleksnih
tipov.
DOGODKI (angl. »events«)
NHibernate ima bogat spekter dogodkov, vsebuje jih preko 20, med najbolj pogostimi
so:[27]
• pred/po-nalaganje (Load),
• pred/po-brisanje (Delete),
• pred/po-vstavljanje (Insert),
• pred/po-posodabljanje (Update).
Entity Framework ima na voljo 2 dogodka:
• ObjectMaterialized (po tem, ko entiteto naložimo iz podatkovne baze),
• shranjevanje sprememb - SavingChanges (pred shranjevanjem sprememb, kar
vključuje vstavljanje, brisanje, posodabljanje).
SLEDENJE SPREMEMBAM (angl. »tracking changes«)
Tako za NHibernate, kot tudi Entity Framework, so vse spremembe vodene na podlagi
ustrezne implementacije enote dela (angl. »unit of work«). Entitete so lahko priložene
51
(angl. »attached«) ali ločene (angl. »deatached«). EF nudi možnost, da posamezna entiteta
za sebe vodi spremembe (angl. »self-tracking entitites«).
SERIJSKO IZVAJANJE SQL (angl. »sql batching«)
NHibernate ima polno podporo za serijsko izvajanje vstavljanja v primeru, da ID generator
ni vezan na podatkovno bazo (ne more bit uporabljen z identiteto).
Entity Framework ne pozna serijskega izvajanja SQL-ov. [28]
6.4 HITROST KLICEV NA PODATKOVNO BAZO
Izvedli smo zmogljivostne teste na različnih količinah podatkov. Najprej smo preizkusili na
enem samem podatku, nato na 100, kasneje na 1000, na koncu pa še na 10.000 podatkih.
To smo storili na dodajanju, brisanju in posodabljanju. Izpustili smo 100 in 1000 test za
branje, saj se rezultati praktično ne razlikujejo.
6.4.1 DODAJANJE PODATKOV
Vstavljanje podatkov z uporabo EF je v povprečju dva krat počasnejše od vstavljanja
podatkov z uporabo NHibernata. Za vstavljanje 10.000 vrstic v tabelo je EF potreboval več
kot 200 sekund. NHibernate na drugi strani je porabil več kot 3 krat manj časa, in sicer 63
sekund.
Graf 6.1: Čas v odvisnosti od količine vstavljenih podatkov za posamezno ogrodje
0
5
10
15
20
1 podatek 100 podatkov 1000 podatkov
Vstavljanje podatkov v PB (v sekundah)
Entity Framework Nhibernate
0
50
100
150
200
250
10000 podatkov
Vstavljanje podatkov v PB (v sekundah)
Entity Framework Nhibernate
52
6.4.2 BRANJE PODATKOV
Z uporabo NHibernate, je branje enega samega podatka za skoraj 70% hitreje kot branje
enega podatka z uporabo Entity Frameworka. Pri količini 10.000 podatkov se ta razlika
nekoliko zmanjša, a zaradi hitrosti poizvedbe je razlika praktično neopazna.
Graf 6.2: Čas v odvisnosti od količine branih podatkov
6.4.3 UREJANJE PODATKOV
Največje razlike med ogrodjema so nastale pri urejanju podatkov. Zasluge gre pripisati
podpori NHibernata za izvajanje serijskih SQL stavkov, katerih Entity Framework sploh ne
podpira.
Graf 6.3: Čas v odvisnosti od količine urejanih podatkov
0
0,5
1
1,5
2
2,5
1 podatek 10000 podatkov
Branje podatkov iz PB (v sekundah)
Entity Framework Nhibernate
0
5
10
15
20
25
1 podatek 100 podatkov 1000 podatkov
Urejanje podatkov v PB (v sekundah)
Entity Framework Nhibernate
0
50
100
150
200
250
10000 podatkov
Urejanje podatkov v PB (v sekundah)
Entity Framework Nhibernate
53
6.4.4 BRISANJE PODATKOV
Tudi pri brisanju podatkov so nastale enormne razlike pri večji količini le-teh. Tako kot pri
posodabljanju podatkov, gre tudi tukaj za prednost NHibernata za izvajanja serijskih SQL
stavkov. Izvajanje brisanja na 1000 podatkih je z uporabo Entity Frameworka za skoraj 10x
počasnejši od svojega konkurenta. Pri 10.000 podatkih je razlika že več kot 10 kratna.
Graf 6.4: Čas v odvisnosti od količine brisanih podatkov
0
5
10
15
20
1 podatek 100 podatkov 1000 podatkov
Brisanje podatkov v PB (v sekundah)
Entity Framework Nhibernate
0
20
40
60
80
10000 podatkov
Brisanje podatkov v PB (v sekundah)
Entity Framework Nhibernate
54
6.5 PREDNOSTI/SLABOSTI OGRODIJ
Pomembnejše lastnosti oziroma funkcionalnosti obeh ogrodij primerjamo v sledeči tabeli.
ENTITY FRAMEWORK NHIBERNATE
Sledenje
spremembam
• spremembe vodene na
podlagi implementacije
»unit of work«,
• entitete omogočajo lastno
sledljivost
• spremembe vodene na
podlagi implementacije
»unit of work«
Integracija in
dokumentacija
• veliko Microsoftovih orodij
integriranih z EF,
• veliko primerov in
dokumentacije na spletu
• brez integracije znotraj
Microsoftovih ogrodij,
• zadostna, osnovna
dokumentacija s primeri
Pred
pomnjenje
• prvo-nivojsko • prvo-nivojsko,
• drugo nivojsko
Možnost
konfiguracije
• osnovna, preko kode • napredna, preko kode,
• možnost konfiguracije
preko XML dokumentov
Zahtevnost • preprost začetek,
• nizka učna krivulja
• težji začetek,
• visoka učna krivulja
Asinhronost • polna podpora asinhronim
klicem
• asinhronost ni podprta
Poizvedbe • LINQ to Entities (največkrat
uporabljen) je izpopolnjen,
• manjša podpora različnim
poizvedovalnim API-jem
• večja podpora različnim
poizvedovalnim API-jem,
• implementiran LINQ
vključuje manj
funkcionalnosti
Hitrost • občutno počasnejši pri
vstavljanju, brisanju in
posodabljanju večjega
nabora podatkov,
• primerljiva pri pridobivanju
podatkov
• občutno hitrejši pri večji
količini podatkov za
vstavljanje, brisanje in
posodabljanje
Tabela 6.2: Primerjava lastnosti obeh ogrodij
55
7 SKLEP
Odločitev, kako bomo manipulirali s podatki, je bistvenega pomena v času načrtovanja
aplikacije. Na voljo je veliko pristopov, ki zagotavljajo delo s podatki. Objektno-relacijska
preslikava je eden izmed teh pristopov, kjer vidno izstopata dve ogrodji, ki smo ju obdelali
v diplomskem delu. Preučili smo ogrodji od strukture pa vse do same uporabe. Odločitve,
katero bi predlagali razvijalcem, ni mogoče enostavno in brezpogojno določiti. Ugotovili
smo, da sta tako Entity Framework, kot tudi NHibernate popolnoma podprti s strani
relacijskih podatkovnih baz. Obe ponujata velik nabor funkcionalnosti s sicer nekaj vidnimi
razlikami, ki lahko pri določenih tipih razvijalcev odločilno vplivajo na izbor. Ena izmed teh
lastnosti je prav gotovo podpora asinhronim funkcijam pri Entity Frameworku in XML
definicije razredov ter preslikav pri NHibernatu. To da ogrodju možnost uporabe modelov
na različnih projektih. Za razvijalce začetnike je zaradi preprostosti ogrodja Entity
Framework veliko boljša izbira, kot bi bila izbira konkurenta. Za ogrodje EF je namreč na
spletu veliko vodičev, primerov kode, dokumentacije, debat na forumu, zaradi česar se
lahko ob morebitnih preprekah težave hitro rešijo. Pri izbiri ogrodja NHibernate pa se
razvijalec v začetku uporabe sooča z drugačnim načinom pristopa definicije preslikav. V
nadaljevanju mu to omogoča veliko naprednejšo uporabo ogrodja, kar vodi k večji
učinkovitosti. Za mnoge razvijalce bi pri izboru ogrodja lahko vplivala razlika med hitrostjo
izvajanja operacij na modelu. Izvajanje osnovnih CRUD metod pri NHiberante je na podlagi
naših testiranj pri večjem številu podatkov tudi za nekaj krat hitrejše od njegovega
konkurenta. Testiranje smo opravljali pri enakih pogojih za obe ogrodji.
Na podlagi ugotovitev tekom izdelave diplomskega dela lahko zaključimo, da sta za večino
aplikacij obe ogrodji povsem konkurenčni. Podamo lahko mnenje, da se za aplikacije, kjer
je bistvenega pomena hitrost izvajanja operacij, uporabi ogrodje NHibernate. Na drugi
strani bi izbrali in priporočali Entity Framework razvijalcem začetnikom, ki šele prihajajo na
velik, a zahteven IT trg.
56
8 LITERATURA
[1] Wikipedia, „ADO.NET“, 2017. [Na spletu]. Dostopno:
https://en.wikipedia.org/wiki/ADO.NET. [Dostopano: 20-jun-2017].
[2] L. Debeljak, „ADO.NET: Osnova za gradnjo sodobne podatkovne programske
opreme“, 2002.
[3] Wikipedia, „Microsoft Data Access Components“, 2017. [Na spletu]. Dostopno:
https://en.wikipedia.org/wiki/Microsoft_Data_Access_Components. [Dostopano:
15-jun-2017].
[4] J. Hubbard, B. Wagner, in Y. Jin, „ADO.NET Architecture“, 2017. [Na spletu].
Dostopno: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ado-
net-architecture. [Dostopano: 24-jun-2017].
[5] J. Hubbard, B. Wagner, in Y. Jin, „.NET Framework Data Providers | Microsoft Docs“.
[Na spletu]. Dostopno: https://docs.microsoft.com/en-
us/dotnet/framework/data/adonet/data-providers. [Dostopano: 19-jul-2017].
[6] Wikipedia, „Comparison of ADO and ADO.NET“, 2014. [Na spletu]. Dostopno:
https://en.wikipedia.org/wiki/Comparison_of_ADO_and_ADO.NET. [Dostopano:
01-jul-2017].
[7] Wikipedia, „Object-relational mapping“, 2017. [Na spletu]. Dostopno:
https://en.wikipedia.org/wiki/Object-relational_mapping.
[8] G. Block, „Ten advantages of an ORM (Object Relational Mapper)“, 2006. [Na spletu].
Dostopno: https://blogs.msdn.microsoft.com/gblock/2006/10/26/ten-advantages -
of-an-orm-object-relational-mapper/.
[9] Y. Bugayenko, „ORM Is an Offensive Anti-Pattern“, 2017. [Na spletu]. Dostopno:
http://www.yegor256.com/2014/12/01/orm-offensive-anti-pattern.html.
[10] R. Krüger, „ORM vs. SQL: When should I use a SQL-centric persistence layer?“, 2016.
[Na spletu]. Dostopno: https://blog.oio.de/2016/05/12/orm-vs-sql-when-should-i-
use-a-sql-centric-persistence-layer/.
[11] Wikipedia, „Entity Framework“, 2017. [Na spletu]. Dostopno:
57
https://en.wikipedia.org/wiki/Entity_Framework. [Dostopano: 10-jul-2017].
[12] J. Lerman in R. Miller, Programming Entity Framework: Code First. O’Reilly Media,
2011.
[13] Tutorials Point, „Entity Framework“, 2015.
[14] „Entity Framework Architecture“. [Na spletu]. Dostopno:
http://www.entityframeworktutorial.net/EntityFramework-Architecture.aspx.
[Dostopano: 25-jun-2017].
[15] P. Sanghani, „C#.NET: Entity Framework Basic - Getting Started“, 2011. [Na spletu].
Dostopno: http://parassanghani.blogspot.si/2011/02/entity-framework-
basics.html. [Dostopano: 19-jul-2017].
[16] J. Hubbard, M. Wenzel, in Y. Jin, „Writing an Entity Framework Data Provider |
Microsoft Docs“. [Na spletu]. Dostopno: https://docs.microsoft.com/en-
us/dotnet/framework/data/adonet/ef/writing-an-ef-data-provider. [Dostopano:
19-jul-2017].
[17] „Entity Framework Version History“, 2016. [Na spletu]. Dostopno:
https://msdn.microsoft.com/en-us/library/jj574253(v=vs.113).aspx. [Dostopano:
11-jul-2017].
[18] NuGet, „NuGet Gallery | EntityFramework 6.1.3“, 2017. [Na spletu]. Dostopno:
https://www.nuget.org/packages/EntityFramework. [Dostopano: 24-jul-2017].
[19] R. Avberšek, „Primerjava pristopov k razvoju podatkovnega sloja z ADO .NET Entity
Framework“, 2012.
[20] Wikipedia, „NHibernate“, 2017. [Na spletu]. Dostopno:
https://en.wikipedia.org/wiki/NHibernate.
[21] Tutorials Point, „NHibernate“, 2015.
[22] P. Prathap, „Born to Automate : NHibernate – Architecture (Part 2)“, 2010. [Na
spletu]. Dostopno: http://blogsprajeesh.blogspot.si/2010/01/nhibernate -
architecture.html. [Dostopano: 10-jul-2017].
[23] J. Kanjilal, „Entity Framework 7: Providing support for new platforms and new data
stores | InfoWorld“, 2015. [Na spletu]. Dostopno:
http://www.infoworld.com/article/2885466/application-development/entity-
58
framework-7-providing-support-for-new-platforms-and-new-data-stores.html.
[Dostopano: 09-jul-2017].
[24] „Configure Entity Mappings using Fluent API in EF Code-First“. [Na spletu].
Dostopno: http://www.entityframeworktutorial.net/code-first/configure-entity-
mappings-using-fluent-api.aspx. [Dostopano: 01-jul-2017].
[25] J. Allen, „Comparing NHibernate and Entity Framework“, 2012. [Na spletu].
Dostopno: https://www.infoq.com/news/2012/06/NHibernate-EF. [Dostopano: 02-
avg-2017].
[26] V. Khorikov, „Entity Framework 6 (7) vs NHibernate 4: DDD perspective - Enterprise
Craftsmanship“, 2014. [Na spletu]. Dostopno:
http://enterprisecraftsmanship.com/2014/11/29/entity-framework-6-7-vs-
nhibernate-4-ddd-perspective/. [Dostopano: 02-avg-2017].
[27] NHiberante, „NHibernate“. [Na spletu]. Dostopno:
http://nhibernate.info/doc/index.html. [Dostopano: 01-jul-2017].
[28] „Chapter 13. Batch processing“. [Na spletu]. Dostopno:
http://nhibernate.info/doc/nhibernate-reference/batch.html. [Dostopano: 09-avg-
2017].