BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

Straipsnių ciklas iš Entity Framework 4 - 6 dalis - darbas su išsaugotomis procedūromis

Parašė Sergejus | 2009-08-04 22:29

Vienas dažniausiai man užduodamų klausimų, susijusių su ORM įrankiais - integracija su išsaugotomis procedūromis (Stored Procedure). Šiandien aš norėčiau parodyti kaip tai daroma su Entity Framework 4.

Pirma apibrėžkime išsaugotą procedūrą (priminsiu, aš dirbu su Blog modeliu):

Kaip matote, mes grąžiname straipsnių skaičių, priskirtų konkrečiai kategorijai, kartu su kategorijos ID ir pavadinimu.

Tolesniam darbui, mums bus reikalingas kompleksinis tipas, skirtas grąžinamai struktūrai apdoroti:

Dabar beliko atnaujinti mūsų modelį …

 … įtraukiant naujai sukurtą išsaugotą procedūrą:

Tam, kad iškviesti šią išsaugotą procedūrą kaip metodą, būtina padaryti „funkcijos importą” …

… ir pasirinkti prieš tai sukurtą kompleksinį tipą kaip grąžinimą tipą:

Štai ir viskas, dabar mes turime tipizuotą išsaugotos procedūros analogą:

Kadangi GetPostCountByTag grąžina C# objektą, darbas su išsaugotomis procedūromis bei funkcijomis pasidaro kaip niekada intuityvus:

Štai ir viskas šiam kartui. Tikiuosi man pavyko parodyti, kad Entity Framework ir išsaugotos procedūros yra visai suderinami dalykai.

Rodyk draugams

Straipsnių ciklas iš Entity Framework 4 - 5 dalis - patobulinimai kelių sluoksnių aplikacijose

Parašė Sergejus | 2009-07-30 23:43

Atėjo laikas aprašyta vieną svarbiausių Entity Framework 4 naujovių - pagerintą darbą kelių sluoksnių aplikacijose. Savo pavyzdyje aš papildomai naudosiu Entity Framework Feature CTP1.

Priminsiu, kad mes dirbame su tokiu modeliu:

Pradėsime nuo to, kad vietoje standartinių EF esybių, mes sugeneruosime taip vadinamas „save stebinčias” (self-tracking) esybes iš EF Feature CTP1:

Generuojamos esybės visiškai nepriklauso nuo Entity Framework, kas leidžia nenaudoti nuorodos į Microsoft.Data.Entity.dll. Šalia duomenų konteksto ir pačių esybių, generuojamos kelios pagalbinės klasės, tame tarpe EntityChangeTrackerAdapter ir ObjectChangeTracker - kurie saugo visus objekto pakeitimus.

Apibrėžkime klasę PostService, kuri turės du metodus darbui su straipsniais: GetPostById ir Save:

Metode GetPostById aš išreikštinai įjungiu automatinį pakeitimų sekimą, nes be jo neveiks kitas mūsų metodas Save. Taip pat šiame metode užklausoje aš nurodau, kad kraunant straipsnius, reikia pakrauti ir susijusius komentarus.

Metode Save aš iškviečiu praplėtimo metodą ApplyChanges, kuris apeina visą esybės grafą ir atlieka reikalingus pakeitimus. Norint pasinaudoti šiuo praplėtimo metodu, būtinai reikia į using dalį įtraukti vardų sritį Microsoft.Data.Objects. ApplyChanges antru parametru priima delegatą, kuris grąžina IEntityChangeTracker interfeisą realizuojantį objektą (automatiškai generuojamas).

Turint servisų klasę, galima pereiti ir prie konkretaus panaudojimo pavyzdžio:

Kaip matyti, pirma aš gaunu atjungtą nuo duomenų konteksto esybę post, sukuriu naują komentarą ir jį pridedu į pradinį straipsnį, po ko išsaugau pakeitimus. Toliau aš dar kartą kreipiuosi į duomenų bazę, pakraunu esybę su prieš tai sukurtu komentaru ir pažymiu jį trynimui. Noriu atkreipti dėmesį, kad visos save stebinčios esybės turi metodus MarkAsUnchanged, MarkAsModified, MarkAsDeleted, MarkAsAdded.

Taigi taip paprastai ir patogiai mes galėjome operuoti esybių grafais atjungtoje (disconnected) aplinkoje. Pagaliau ateina laikas, kada WCF ir ASP.NET aplikacijose bus paprasta operuoti esybių grafais!

Rodyk draugams

Straipsnių ciklas iš Entity Framework 4 - 4 dalis - POCO generavimas

Parašė Sergejus | 2009-07-08 23:45

Praeitoje dalyje aš aprašiau Entity Framework 4 POCO palaikymą. Jums galėjo kilti natūralus klausimas: kam reikia aprašinėti POCO rankomis, jeigu jau turime aprašytą koncepcinį modelį (CSDL failą). Nors EF4 Beta 1 palaiko tik vieną (ne POCO) T4 generavimo šabloną, prieš porą savaičių pasirodžiusi pirmoji Entity Framework 4.0 Feature CTP versija pateikia ir taip laukiamą T4 POCO šabloną. Trumpai aprašysiu kaip galima pasinaudoti šiuo šablonu ir automatiškai sugeneruoti reikalingas POCO klases.

Pirma reikia įsitikinti, kad EDMX failo Custom Tool savybė yra išvalyta:

Tada dizaineryje iš kontekstinio meniu pasirenkame punktą Add New Artifact Generation Item (ateinančiose EF versijose jis vadinsis kitaip):

Atsiradusiame Add New Item lange nurodome EntityFramework POCO Code Generator:

 Rezultate mums bus sugeneruotas duomenų kontekstas ir visos POCO klasės:

Sugeneruotos klasės atrodo pakankamai švariai, bet neaiškumų man kilo dėl kompleksinių savybių kodo:

Noriu priminti, kad šis T4 POCO generavimo šablonas yra pakankamai ankstyvoje stadijoje ir esu įsitikinęs, kad jis dar keisis nekartą. Nepaisant to, manau sutiksite, tai yra didžiulis Entity Framework žingsnis pirmyn, lyginant su pirma versija!

Rodyk draugams

Straipsnių ciklas iš Entity Framework 4 - 3 dalis - POCO palaikymas

Parašė Sergejus | 2009-07-06 22:08

Antroje Entity Framework 4 dalyje aš aprašiau naują „pirmą modelis” galimybę. Tada mes apsistojome ties tokiu koncepciniu modeliu:

Šiandien aš norėčiau jums parodyti, kaip galima naudoti POCO (Plain Old CLR Object) kartu su Entity Framework 4. Tam reikia atlikti keletą paprastų žingsnių:

  1. Kada norima patiems aprašyti modelio klases, pirma reikia uždrausti Entity Framework generuoti jo standartinius objektus. Tai galima padaryti ištrynus Custom Tool savybės reikšmę:
  2. Dabar mes turime EDMX failą be jokių sugeneruotų C# klasių. Remiantis mūsų modeliu, aprašome atitinkamas POCO klases:
  3. Turint modelio klases, laikas aprašyti duomenų kontekstą. Naujojo IObjectSet interfeiso pagalba, duomenų kontekstas dabar gali būtų labai paprastai testuojamas:

Štai mes ir galime pradėti dirbti su Entity Framework. Pradžiai, sukurkime straipsnį ir vieną gairę (tag):

Kodas yra pakankamai akivaizdus, išskyrus metodą FixUpTag. Pateiktame pavyzdyje, aš priskiriu gairę „Entity Framework” naujam straipsniui. Tai reiškia, kad esybė tag turėtų irgi rodyti į naujai apibrėžtą straipsnį. Tai vadinama sąryšio sutvarkymu. Deja, pirmoji Entity Framework 4 Beta versija automatiškai to nepadaro, bet anot EF komandos, tai bus sutvarkyta ateinančioje Beta versijoje, todėl mano metodas FixUpTag yra tik laikinas sprendimas.

Įvykdžius aukščiau pateiktą kodą, natūraliai duomenų bazėje atsiranda visi reikalingi įrašai:

Dar vienas svarbus niuansas - objekto pakeitimų stebėjimas. Įvykdžius žemiau pateiktą kodą mūsų aprašytiems POCO, gausime nevisai to ko tikimės:

Tam, kad gauti visus objekto pakeitimus galima rankiniu būdu iškviesti metodą context.DetectChanges() arba, kas rekomenduojama iš greitaveikos pusės, pažymėti visas objekto savybes kaip virtual:

Entity Framework moka nurodytiems POCO generuoti proxy klases, ir virtualių savybių pagalba gali perrašyti jas taip, kad visi pasikeitimai būtų automatiškai stebimi:

Taip pat noriu pabrėžti, kad nuorodos į kitus objektus (ICollection<Tag>, Post ir pan.), turėtų visada būti virtualios savybės, nes tik šiuo atvejų Entity Framework palaikys duomenų pakrovimą pagal poreikį (lazy-loading).

Tiek šiam kartui iš POCO, kitą kartą parodysiu kaip galima automatiškai generuoti POCO pasinaudojant T4 šablonais iš Entity Framework 4.0 Feature CTP 1.

Rodyk draugams

Straipsnių ciklas iš Entity Framework 4 - 2 dalis - pirma modelis

Parašė Sergejus | 2009-06-24 19:07

Štai ir atėjo laikas antram straipsniui iš Entity Framework 4 serijos. Šiandien aš trumpai aptarsiu kelias naujoves: „pirma modelis” ir „kompleksinės savybės”. Šiame straipsnyje aš detaliai nenagrinėsiu esybių pridėjimo ir panašių dalykų, kas nuo pirmos versijos praktiškai nepasikeitė, o susikoncentruosiu išskirtinai ties naujovių.

Pradėsime nuo tuščio duomenų modelio pridėjimo. Nors pirmoje versijoje ši galimybė jau egzistavo, praktikoje ji neveikė. Ketvirtoje Entity Framework versijoje tai yra ištaisyta.

Sukūrę tuščią duomenų modelį pasižiūrėkime ką siūlo kontekstinis meniu:

Lyginant su pirma versija, atsirado tokios galimybės kaip duomenų bazės skripto generavimas, generavimo artifakto pridėjimas, kompleksinės savybės ir daugiau.

Kas man nelabai patiko, kad šiuo metu visos eilutės pagal nutylėjimą nepalaiko Unicode, tai reikia įjungti išreikštinai:

Aš ką tik iškėliau šį klausimą EF komandai ir gavau atsakymą, kad tai yra klaida, kuri šiuo menu yra taisoma. Pagal nutylėjimą eilutės BUS Unicode.

Kaip aš jau rašiau, naujoje Entity Framework versijoje atsirado galimybė kurti ir redaguoti kompleksines savybes tiesiogiai iš interfeiso (anksčiau tam reikėjo redaguoti susiejimo failus):

Kaip matyti, aš sukūriau kompleksinę savybė Author, kurią sudaro trys laukai: Blog, Email ir Name. Aiškumo dėlei pažymėsiu, kad kompleksinės savybės duomenų bazėje saugomos kartu su esybių savybėmis, o logiškas atskyrimas yra tik koncepciniame lygmenyje:

Šiame straipsnyje aš kursiu blogo modelį, sudarytą iš trijų pagrindinių esybių: komentarai, gairės (taip, taip, Tag oficialiai verčiamas kaip gairė) ir straipsniai. Tarp straipsnių ir gairių apibrėžtas daug su daug ryšis, o tarp straipsnių ir komentarų - vienas su daug. Norėdami pagal tokį koncepcinį modelį sugeneruoti duomenų bazės schemą, užtenka iškviesti kontekstinį meniu ir jame pasirinkti atitinkamą punktą:

Šiuo metu duomenų bazės schemos generavimas yra sudarytas iš dviejų etapų: SQL sakinių generavimo ir jų vykdymo reikalingoje duomenų bazėje. Ateityje antras etapas tikriausiai bus automatizuotas.

Pasirinkus Generate Database Script from Model, atsiranda vedlys, kuriame reikia nurodyti prisijungimo eilutę ir (jeigu reikia) sukurti tuščią duomenų bazę:

Rezultate mes turime pagal modelį sugeneruotus SQL sakinius, kurie iš karto bus išsaugoti atskirame faile:

 

Sugeneruotus ir išsaugotus SQL sakinius mes galime įvykdyti reikalingoje duomenų bazėje:

Atkreipkite dėmesį į tai, kad kompleksinės savybės elementai turi prefiksą Author, o mūsų daug su daug ryšiui tarp straipsnių ir gairių bus automatiškai sukurta tarpinė lentelė PostTag. Įvykdžius šiuos SQL sakinius, duomenų bazės schema atrodys taip:

Štai ir viskas! Toks duomenų bazės schemos kūrimo būdas tikriausiai bus kritikuojamas DB administratorių, bet mums, programuotojams, jis yra žymiai intuityvesnis.

Kitame straipsnyje aš pademonstruosiu Entity Framework 4 POCO palaikymą.

Rodyk draugams

Entity Framework 4.0 Feature CTP 1

Parašė Sergejus | 2009-06-23 19:47

Savo trumpoje Entity Frarmework 4.0 apžvalgoje aš paminėjau, kad nors pirmoje beta versijoje ir nėra šablonų, skirtų generuoti POCO arba pakeitimus sekančius (self-tracking) objektus, tokia galimybė turi atsirasti. Šiandien viešai pasirodė pirmoji CTP versija Entity Framework 4.0 Feature, kurioje aukščiau išvardintus dalykus jus ir galėsite rasti.

Rodyk draugams

Straipsnių ciklas iš Entity Framework 4 - 1 dalis - apžvalga

Parašė Sergejus | 2009-06-18 21:32

Viena svarbiausių (bent jau man) Visual Studio 2010 naujovių - Entity Framework 4. Nors tikroji Entity Framework versija ir yra 2, suvienodinimui oficialiai jis vadinasi pagal .NET Framework versiją, t.y. EF 4. Verta pabrėžti, kad nors EF 1 ir buvo pozicionuojamas kaip galingesnis ORM įrankis negu LINQ to SQL, dėl savo neužbaigtumo ir elementariausių funkcijų nebuvimo, LINQ to SQL buvo naudojamas žymiai dažniau. Pirmoji versija sulaukė tikrai nemažos kritikos ir dėl to ypač džiugu, kad Microsoft rimtai pasižiūrėjo į nauja EF versiją. Šiame straipsnyje aš trumpai aprašysiu visus pasikeitimus nuo pirmos versijos, o kituose straipsniuose - išnagrinėsiu pagrindines naujoves detaliau.

Atvirai tariant, jeigu EF 1 savo projektuose aš nenorėjau naudoti (naudojau LINQ to SQL), tai 3 savaites padirbęs su EF 4 galiu teigti, kad kitas mano projektas tikriausiai naudos naują Entity Framework. Kas gi atsirado naujo?

POCO

Pagaliau! Paskutiniu metu aš esu didelis POCO (Plain Old CLR Object) proponentas, nes jų pagalba galima aprašyti saugojimui neutralias klases, kurios realiai nepriklauso nei nuo konkretaus duomenų šaltinio, nei nuo kitų sąlygų. EF 4 leidžia aprašyti EDMX modelį ir kartu su juo naudoti POCO klases.

Testuojamumas

Iki šiol, tam kad prieiti prie duomenų bazės lentelių, Entity Framework duomenų kontekste naudojo ObjectQuery<T> klasę. Dabar atsirado klasė ObjectSet<T>, kuri paveldi iš ObjectQuery<T> ir realizuoja interfeisą IObjectSet<T>. Tai reiškia, kad pagaliau testavimo metu mes galime pakeisti duomenų konteksto realizaciją.

Pirma modelis

EF 1 reikalavo egzistuojančios duomenų bazės schemos. EF 4 gi leidžia pirma sukurti verslo esybes ir sąryšius tarp jų, o tik paskui pagal tai sugeneruoti duomenų bazės schemą.

Kodo generavimas

Tiek LINQ to SQL, tiek EF 1 turėjo nemažą trūkumą - mes neturėjome būdo įtakoti generuojamo kodo. EF 4 kodo generavimui naudoja T4 (Text Template Transformation Toolkit). Kartu su Visual Studio 2010 Beta 1 yra pateikiamas vienintelis kodo generavimo šablonas, kuris naudoja ObjectSet bazines klases, bet MVP Summit metu buvo pažadėta, kad Microsoft komanda papildomai išleis POCO generavimo šabloną bei šabloną skirtą N-sluoksnių aplikacijų kūrimui.

LINQ operacijos

Kaip nebūtų keista, bet skirtingai nei LINQ to SQL, EF 1 turėjo prastą LINQ operacijų palaikymą. Taip, pavyzdžiui, nebuvo palaikomos tokios operacijos kaip Contains, DefaultIfEmpty, First, FirstOrDefault. Nuo dabar palaikomos praktiškai visos LINQ operacijos, kas leidžia testavimui naudoti ne LINQ to Entities, bet LINQ to Objects.

Lazy Loading

Sunku suvokti, bet pirmoji Entity Framework versija nepalaikė automatinio duomenų pakrovimo pagal poreikį (Lazy Loading). Laimei, tai yra sutvarkyta EF 4.

N-sluoksnių aplikacijos

Valio! Attach, Detach, automatinis esybių būsenos stebėjimas ir kiti pakeitimai. Daugiau informacijos apie tai viename iš būsimų straipsnių.

Vardų servisas

Ką LINQ to SQL mokėjo nuo pat pradžių, Entity Framework tik dabar objektų vardus paverčia į vienaskaitą, o 1:N ir N:M ryšių pavadinimus - į daugiskaitą.

Kompleksinės savybės

Ženkliai supaprastėjo darbas su EF kompleksinėmis savybėmis, kurias dabar galima kurti tiesiai iš Entity Framework grafinio redaktoriaus.

Varotojo apibrėžtos funkcijos

Taip! Pagaliau vartotojo apibrėžtos funkcijos (UDF) prieinamos tiesiai iš Entity SQL.

Šiame straipsnyje aš trumpai aprašiau visas pagrindines Entity Framework naujoves. Kitoje dalyje aš jau pereisiu prie konkrečių pavyzdžių.

Rodyk draugams