6 Comments

Moje putovanje kroz ORM alate traje dugo, počelo je onog dana kada mi je netko rekao ili pokazao da postoji bolji način rada od upotrebe SqlConnection, SqlCommand i SqlReader objekata.Tu negdje sam i upoznao DataSet-ove, kao memorijsku reprezentaciju baze podataka, sa svim tablicama i relacijama, ali nakon kratke upotrebe sam odlučio da je to krivi način rada sa c#-om. U .NET ekosustavu su se tada (cca 2005) već pojavili brojni ORM alati, i bilo je svega: od generatora koda i ogromnih konfiguracijskih XML datoteka, do malih jednostavnih frameworka. Ubrzo je i Microsoft izdao prve verzije svojih konja za trke: Linq2Sql i Entity Framework. Linq2Sql sam i koristio neko vrijeme, prvenstveno zbog svoje jednostavnosti konfiguracije i upotrebe – drag’drop baze u dizajner, i voilà, klase su spremne za upotrebu! [more]

EF v1 je nastao nad ostatcima Longhorn WinFS arhitekture i ObjectSpaces projekta, koji je trebao riješiti problem  pristupa podacima sa jedne više razine, uvesti konceptualni model koji odvaja same fizičke podatke, bili oni relacijski, fajlovi, datoteke, od njihove konzumacije putem objektnog modela.

Ali ono što je trebao raditi, pristupati SQL bazi, radio je vrlo osrednje, blago rečeno. Sa verzije 1 se skočilo na verziju 4 i EF je postao upotrebljiv alat. Ja sam i dalje koristio neke druge ORM alate, jer nisam htio koristiti pregeneriran kod koji je u EF4 slučaju za malo veću bazu rastao na tisuće i tisuće linija koda, a dizajner  postaje neupotrebljiv.

EF 4.3 je konačno ponudio pravi Code-First pristup: na osnovu klasa entiteta i kontexta bio je u stanju kreirati bazu, upite, i puniti objekte sa podacima iz baze, sve na osnovu konvencija.  Upravo ono što se i zahtjeva od jednog ORM alata. EF 5 je ubrzo donio poboljšanja: korištenje enum tipova, spacijalnih tipova i nemalo povećanje brzine. Da stvar bude još bolja, EF 5 je izdan pod Apache licencom, a izvorni kod je dostupan na Codeplexu!

EF 5 omogućava i izradu migracijskih (DDL) skripti: svaka promjena sheme baze je izvedena pomoću skripte. Za kreiranje baze dovoljno je pokrenuti slijedno sve skripte (naravno, ne ručno, ima alat za to). U bazu je također zapisana verzija, a svaka migracijska skripta predstavlja određenu verziju baze, čime se mogu izvršiti migracijske skripte između dvije specificirane verzije. Skripte nije potrebno odmah izvršiti, može se i ispisati SQL kod koji db admin potom izvrši na samoj bazi (-script flag nakon Update-Database).

Prije korištenja EF 5 potrebno je zadovoljiti neke preduvjete: za punu funkcionalnost EF 5 potrebno je koristit .NET 4.5, jer u slučaju .NET 4 nema podrške za enume, spacijalne tipove i veću brzinu izvršavanja. Stoga možemo reći da je .NET 4.5 obavezan (iako, sve .NET 4 aplikacije su kompatibilne i sa .NET 4.5, ne bi trebala postojati prepreka podizanja na novu verziju .NETa). EF 5 se sastoji od nekoliko dijelova, koji će se distribuirati nezavisno:
Jezgra:
- Core EF Runtime (System.Data.Entity.dll & System.Web.Entity.dll)
- EF Designer
Komponente (moguće su češće nadogradnje):
- DbContext API i Code First
- T4 predlošci za Model First i Database First pristup
- EF Power Tools
- Code First migracije
više o ovoj podjeli i .NET 4/4.5 razlikama možete saznati na stackoverflow pitanju

EF 5 se dodaje u projekt putem Nuget alata, pomoću GUIa ili izvršavanje  naredbe u Package Manager konzoli (konzola ima intellisense, pozivate ga sa Tab tipkom čim natipkate prvih par slova naredbe):
Install-Package EntityFramework


Za jednostavni primjer napraviti ćemo entitete za web shop: kategorije i proizvodi (oh maštovitosti!).

Da bi EF znao ispravno mapirati .NET tipove podataka (string, int, List<>, …) potrebno se pridržavati konvencija pisanja, npr. polje (property) primarnog ključa se mora zvati ID ili ProductId, iako se to može naknadno konfigurirati (putem DbContexta, migracija ili DataAnnotation atributa)

U primjeru su definirane klase Product i Category, ali i DbContext (ObjectContext klasa u EF4) koja se brine za izradu upita i praćenje promjena proptertya objekta. Virtual keyword je preporučeno dodati na kompleksne tipove da bi Lazy-Load radio.  Za korištenje migracija potrebno je uključiti ih, opet u Package Manager konzoli:

PM> Enable-Migrations
Checking if the context targets an existing database...
Code First Migrations enabled for project ConsoleApplication2.

dodati će se novi Migrations folder u projekt i Configuration.cs datoteka. Da bi kreirali našu prvu migracijsku skriptu može izgraditi samu bazu na osnovu našeg modela potrebno je pozvati naredbu Add-Migration sa nazivom prve migracije (Init u ovome slučaju):

PM> Add-Migration Init
Scaffolding migration 'Init'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration 201210301134148_Init' again.

U Migrations folder je dodana prva migracijska skripta, koja u imenu fajla sadrži timestamp, da bi se zadržao redoslijed izvršavanja. Skripta sadrži DSL kod koji će se prevesti u DDL SQL, a mi možemo slobodno modificirati, dodavati indexe, ključeve, podešavati tipove podataka:

Zadnji korak je samo pokretanje migracije i podizanje baze za posljednju verziju:

PM> Update-Database
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying code-based migrations: [201210301134148_Init].
Applying code-based migration: 201210301134148_Init.
Running Seed method.

Baza je kreirana! Ako sada promijenimo neki property (promijenimo tip podataka, dodamo property, izbrišemo ga, …) na entitetu i ponovo pokrenemo Add-Migration uočiti ćemo da je EF ispravno uočio promjene i skriptirao ih, a ukoliko nije, možemo ručno dodati u migracijsku datoteku potrebne promjene.

EF 5 omogućava vrlo jednostavnu upotrebu POCO objekata, bez konfiguracije i mapiranja možemo pripremiti naše klase za rad sa bazom u vrlo kratkom vremenu. Dodavanje migracija i njihovo izvršavanje se svodi na pokretanje dvije naredbe u konzoli (Add-Migration i Update-Database). Možda nije najmoćniji ORM (sigurno nije), ali zbog ovako jednostavne upotrebe, lagane konfiguracije mojim potrebama (convention override) ja ga upotrebljavam svakodnevno i do sada nisam imao posebnih problema u radu Smiješak s namigivanjem

Comments

Comment by Luka

Što se tiče dbmigrationa, MVC4 Database migrations uz pomoč EF može sam generirati skripte iz POCO entity objekta. Nije potrebno ručno pisati ih. :-)

Još uvjek je bolji NH :-)

Luka
Comment by hudo

Nije ih potrebno ručno pisati, Add-Migration kreira skriptu, ali se opet može rućno pisati ako zatreba!
EF je dobio migracije u paketu, ali koliko mi je poznato NH ih nema, mora se koristiti neki third-party alat. Ali sto se tice samog ORMa, EF je sigurno daleko jos od NHa, iako za vecinu potreba je sasvim dovoljan.

Comment by obscure

Jesi radio sa membershipom ?ja kad one tablice koje dobijem u membership provideru ubacim u entity data model i dodam neki entitet tj. povezem sa aspnet_membership i idem "Generate database from model" membership se raspadne, ne mogu recimo dodavati usere preko Project->Asp.net configuration?Jel bi znao o cemu je rijec?

obscure
Comment by hudo

obscure: da, koristim novi membership. Trik je u tome da koristis SimpleMembershipProvider, i malo promjenis poziv jedne metode u WebSecurity objektu, unutar AccountControllera, da mu kazes da treba koristiti tvoj User objekt. O tome smo nedavno raspravljali ovdje: www.webmajstori.net/.../39496-asp-net-mvc-4-i-user-id

Comment by obscure

Zaboravih reći da koristim mvc 3..

obscure