Taigi kaip ir žadėjau, šiandien parodysiu kaip galima įgalinti naudoti Entity Framework kartu su POCO. Prieš tęsiant labai rekomenduoju dar karta peržiūrėti mano ankstesnius straipsnius skirtus Entity Framework.
Pirma reikia parsisiųsti Entity Framework POCO adapterio projektą. Toliau naudosime du failus: EFPocoAdapter.dll ir EFPocoClassGen.exe. Savo pavyzdyje paprastumo dėlei aš praleisiu verslo logikos arba servisų sluoksnį bei naudosiu gerai žinomą Northwind duomenų bazę. Aš jau rodžiau kaip galima pridėti Entity Framework EDMX failą nurodytai duomenų bazei, todėl iškarto pereisiu prie pradinės mano Visual Studio sprendimo struktūros:

Pasirinkus, kad Entity Framework sugeneruotų esybes ir susiejimus tik lentelėms, turėtumėte matyti panašų vaizdą:

Kadangi POCO panaudojimas kartu su Entity Framework remiasi tam tikru papildomu kodo generavimu, pridėkime EFPocoAdapter.dll ir EFPocoClassGen.exe į mūsų Data projektą:

Paprasčiausias būdas sugeneruoti POCO pagal mūsų EDMX failą, pasinaudoti EFPocoClassGen įrankiu. Tam galima sukonfigūruoti jį kaip išorinį Visual Studio įrankį. Tam nueiname į Tools → External Tools ir pridedame naują įrankį:

Komandos laukelyje įvedame $(SolutionDir)Data\Dependencies\EFPocoClassGen.exe, o argumentų laukelyje - /mode:PocoClasses /inedmx:$(SolutionDir)Data.Model\Northwind.edmx /outputDir:$(SolutionDir) /map:Data.Model=Data.Entities.
Trumpai paaiškinsiu perduodamus argumentus. Mode argumentas nusako kas bus generuojama: POCO klasės, POCO adapteris ar POCO konteineris (kontekstas). Inedmx argumentui perduodame kelią iki mūsų EDMX failo. OutputDir argumentas nurodo kur turi būti patalpintos sugeneruotos POCO klasės (visos klasės bus automatiškai talpinamos kataloge, kurio vardas sutaps su klasių vardų sritimi). Map argumentas leidžia sugeneruotas klases patalpinti į tam tikrą naują vardų sritį. Tai reikia tam, nes Entity Framework jau turi sugeneruotas esybes su tokiais pačiais vardais, todėl POCO esybės turi priklausyti kitai vardų sričiai.
Išsaugojus nustatymus ir iškvietus šį įrankį iš meniu Tools, bus sugeneruotos POCO klasės, kurias mes turime įtraukti į Data.Entities projektą

Sugeneruotos POCO klasės pavyzdys pateiktas žemiau:

Kas svarbu, POCO klasės nenaudoja jokių Entity Framework specifinių klasių kaip EntitySet ar EntityRef. Nepaisant to, POCO adapteris leidžia pasinaudoti duomenų pakrovimu pagal poreikį galimybe (Lazy Loading). Tam tereikia reikiamas savybes pažymėti kaip virtual arba jų tipą pakeisti į interfeisą (kaip yra su kolekcijomis)

Šiam momentui mes turime Entity Framework POCO klases, bet tam kad jas panaudoti reikia dar sugeneruoti patį POCO adapterį bei POCO konteinerį (kontekstą). Rekomenduojama šį generavimą automatizuoti susiejant su projekto pre-build įvykiu. Tam einame į projekto savybes, pasirenkame kortelę Build Events ir į Pre-build laukelį įvedame dvi komandas:
“$(ProjectDir)Dependencies\EFPocoClassGen.exe” /mode:PocoAdapter “/inedmx:$(SolutionDir)Data.Model\Northwind.edmx” “/outputfile:$(ProjectDir)NorthwindAdapter.cs” “/ref:$(SolutionDir)\Data.Entities\bin\$(ConfigurationName)\Data.Entities.dll” /map:Data.Model=Data.Entities
“$(ProjectDir)Dependencies\EFPocoClassGen.exe” /mode:PocoContainer “/inedmx:$(SolutionDir)Data.Model\Northwind.edmx” “/outputfile:$(ProjectDir)NorthwindEntities.cs” “/ref:$(SolutionDir)\Data.Entities\bin\$(ConfigurationName)\Data.Entities.dll” /map:Data.Model=Data.Entities

Kaip ir anksčiau, mes pasinaudojame EFPocoClassGen įrankio pagalba. Rezultate gauname dvi klases NorthwindAdapter ir NorthwindEntities. Kadangi sugeneruotos klasės naudoja POCO esybes ir Entity Framework, papildomai reikia pridėti nuorodas į Data.Entities.dll ir EFPocoAdapter.dll

Turint POCO klases, POCO adapterį ir POCO konteinerį, mes galime pagaliau pereiti prie jų panaudojimo. Kaip ir dera, pirma mes turime apsirašyti Entity Framework prisijungimą prie duomenų bazės bei nurodyti kelią iki schemos aprašo, sąsajos aprašo ir esybių aprašo. Minėti trys failai automatiškai įeina į EDMX failą ir yra įkompiliuojami kaip resursai, todėl prisijungimo eilutė mano atveju atrodys taip:

Pats POCO klasių panaudojimas praktiškai niekuo nesiskiria nuo Entity Framework klasių naudojimo

Taigi tiek Entity Framework naujienų šiam kartui, lauksime pilno POCO palaikymo antroje Entity Framework versijoje.
Rodyk draugams
Naujausi komentarai