Programavimas

Geriausia „Entity Framework“ našumo gerinimo praktika

„Microsoft Entity Framework“ yra išplėstinė ORM, padedanti atskirti programos objektų modelį nuo duomenų modelio. Tai yra atviro kodo ORM sistema, skirta ADO.Net ir įtraukta kaip .Net Framework dalis. Šiame įraše pateiksiu keletą patarimų, kurių galima laikytis, norint optimizuoti „Entity Framework“ našumą. Tolesniuose skyriuose išnagrinėsiu keletą patarimų, kuriuos galima pritaikyti, kad pagerintumėte programos našumą, kai dirbate su „Entity Framework“.

Ar jūsų subjekto duomenų modelis atspindi vieną darbo vienetą?

Kurdami savo EDM (subjekto duomenų modelį) turėtumėte įsitikinti, kad EDM atspindi vieną darbo vienetą, o ne visą duomenų bazę, ypač kai jūsų duomenų bazėje yra daug atjungtų objektų (lentelių, saugomų procedūrų, rodinių ir kt.) arba nereikia tam tikram darbo vienetui. Jei jūsų EDM vaizduoja visą duomenų bazę, kai to nereikia, tai gali pabloginti programos našumą, nes reikia į atmintį įkelti daug nereikalingų objektų. Iš esmės turėtumėte suskaidyti didelių objektų duomenų modelį į mažesnius, o kiekvienas modelis atspindi darbo vienetą.

Šiame MSDN straipsnyje rasite daugiau informacijos apie tai, kaip galima pagerinti „Entity Framework“ našumą.

Išjungti pakeitimų stebėjimą

Turėtumėte išjungti pakeitimų stebėjimą, jei to nereikia. Svarbiausia, kad jums nereikia stebėti pakeitimų, kai norėtumėte gauti tik duomenis, o perskaitytų duomenų atnaujinimai visai nereikalingi. Šį teiginį galite naudoti norėdami išjungti pakeitimų stebėjimą arba talpinti užklausos rezultatą talpykloje, kai norite gauti klientus iš duomenų bazės, nereikia atnaujinti įrašų.

Jei norite išjungti lentelės Klientai objektų stebėjimą, galite naudoti šį kodą.

„PayrollContext“ kontekstas = naujas „PayrollContext“);

Sumažinkite peržiūrų generavimo kainą naudodami iš anksto sukurtus rodinius

„ObjectContext“ sukūrimas yra brangi operacija, nes ji apima metaduomenų įkėlimo ir patvirtinimo išlaidas. Turėtumėte pasinaudoti iš anksto sukurtais rodiniais, kad sutrumpintumėte atsakymo laiką, kai bus įvykdyta pirmoji užklausa. Iš esmės „Entity Framework“ vykdymo laikas sukuria klasių rinkinį (dar vadinamą rodiniu), kai objekto kontekstas yra pirmą kartą išaiškinamas. Galite sumažinti šią pridėtinę kainą iš anksto sugeneruodami EDMX failo rodinį naudodami komandų eilutės įrankį „EdmGen.exe“ arba T4 šablonus. Atminkite, kad jei pasikeitė modelio schemos failai, turėsite iš naujo sugeneruoti rodinių failą, vykdydami „EdmGen.exe“ su vėliava / mode: ViewGeneration. Taip pat galite iš anksto sugeneruoti rodinius naudodami pirmąjį kodo modelį.

Išjungti automatinį pakeitimų aptikimą

Bandydamas atnaujinti duomenų bazę, „Entity Framework“ turi žinoti pakeitimus, kurie buvo atlikti objekte nuo to laiko, kai jis buvo įkeltas į atmintį. Šis pokyčių aptikimas atliekamas lyginant senas ypatybių reikšmes su naujomis ar pakeistomis reikšmėmis, kai skambinate į tokius metodus kaip „Rasti“ (), „Pašalinti“ (), „Pridėti“ (), „Pridėti“ () ir „SaveChanges“ ()). Šis pokyčių aptikimas yra labai brangus ir gali pabloginti programos našumą, pirmiausia dirbant su daugeliu subjektų. Galite išjungti pakeitimų aptikimą naudodami šį kodą.

Kai norite išjungti pakeitimų aptikimą, tai yra gera praktika, kai jį išjungiate bandymo / gaudymo bloke ir tada vėl įjungiate paskutiniame bloke. Atminkite, kad to galite nepaisyti, kai dirbate su palyginti mažu duomenų rinkiniu - išgausite pokyčių aptikimą, kai dirbate su dideliu duomenų rinkiniu, gausite reikšmingą našumą.

Kiti dalykai, kuriuos reikia nepamiršti

Naudokite projekcijas, kad pasirinktumėte tik tuos laukus, kurie reikalingi gaunant duomenis. Turėtumėte vengti nereikalingų laukų.

Šis kodo fragmentas iliustruoja, kaip galite gauti duomenis puslapiu būdu - atkreipkite dėmesį, kaip pradinio puslapio rodyklė ir puslapio dydis buvo naudojami tik reikalingiems duomenims pasirinkti.

int pageSize = 25, pradedantPageIndex = 1;

„NorthwindEntities dataContext“ = naujos „NorthwindEntities“);

Sąrašas lstCus = dataContext.tblCustomers.Take (pageSize)

. Praleisti (StartPageIndex * pageSize)

.Išvardinti();

Taip pat turėtumėte pasirinkti tinkamą rinkinį ir naudoti kompiliuotas užklausas, kad pagerintumėte savo LINQ užklausų našumą, kai gaunate duomenis, kuriuos atskleidė EDM. Venkite traukti visus duomenų bazės objektus iš vieno objekto duomenų modelio. Gaukite tik reikiamą įrašų skaičių ir venkite „Contains“, kai naudojate LINQ subjektams. Galite naudoti ieškant tik tų duomenų, kurių prašoma, arba apriboti duomenų, gaunamų iš duomenų bazės, kiekį. Be to, turėtumėte pridėti indeksus prie savo subjektų, paskambindami į metodą „CreateIndex ()“.

Iš šios nuorodos galite sužinoti daugiau apie našumo aspektus, kai naudojate „Entity Framework“.