BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

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

Atostogos pasibaigė - atgal prie straipsnių

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

Štai ir pasibaigė mano atostogos Italijoje. Keliaudamas pavargau, bet už tat neįtikėtinai daug pamačiau. Artimiausiu metu grįšiu prie straipsnių ciklo iš Entity Framework 4.0.

P.S.
Kam įdomu pasižiūrėti nuotraukas - prašom į Picasa.

Rodyk draugams

Atostogos!

Parašė Sergejus | 2009-07-09 20:53

Pagaliau ir aš sulaukiau atostogų. Dvi savaites keliausiu po Italija, tad naujų straipsnių šiuo laikotarpių nebus. Grįžęs iš kelionės, pratęsiu straipsnių ciklą iš Entity Framework.

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

Antri metai kaip MVP

Parašė Sergejus | 2009-07-01 22:51

Vakar pasibaigė mano pirmi metai kaip MVP. Turiu pripažinti, kad šie metai tikrai buvo labai įdomūs ir naudingi. Šiandien, Lietuvos .NET vartotojų grupės susitikimo metu, gavau laišką, kad mane apdovanoja ir šiais metais! Pats laiškas skambėjo taip:

Dear Sergejus Barinovas,

Congratulations! We are pleased to present you with the 2009 Microsoft® MVP Award! This award is given to exceptional technical community leaders who actively share their high quality, real world expertise with others. We appreciate your outstanding contributions in Visual C# technical communities during the past year.

Valio!

Rodyk draugams