Najbolji postupci za poboljšanje izvedbe Entity Framework-a

Microsoftov Entity Framework prošireni je ORM koji vam pomaže izolirati objektni model vaše aplikacije od podatkovnog modela. To je okvir otvorenog koda ORM za ADO.Net i uključen je kao dio .Net Framework. U ovom postu predstavit ću nekoliko savjeta koje možete slijediti za optimizaciju izvedbe Entity Framework-a. U sljedećim odjeljcima proučio bih nekoliko savjeta koji se mogu usvojiti za poboljšanje performansi aplikacija kada radite s Entity Frameworkom.

Predstavlja li vaš model entiteta jednu jedinicu rada?

Kada kreirate svoj EDM (Entity Data Model), trebali biste osigurati da EDM predstavlja jednu jedinicu rada, a ne cijelu bazu podataka, posebno kada u vašoj bazi podataka imate mnogo objekata (tablice, pohranjene procedure, pogledi itd.) Koji su povezani ili nisu potrebne za određenu radnu jedinicu. Ako vaš EDM predstavlja cijelu bazu podataka kada nije potrebna, može pogoršati performanse aplikacije zbog potrebe učitavanja mnogih nepotrebnih objekata u memoriju. U osnovi, trebali biste rastaviti model podataka velikog entiteta na manje, pri čemu svaki model predstavlja jedinicu rada.

Možete se obratiti ovom MSDN članku za više informacija o tome kako se mogu poboljšati performanse Entity Framework-a.

Onemogući praćenje promjena

Trebali biste onemogućiti praćenje promjena ako nije potrebno. Što je najvažnije, nije vam potrebno praćenje promjena kad biste samo željeli dohvatiti podatke, a ažuriranja pročitanih podataka uopće nisu potrebna. Sljedeću izjavu možete koristiti za onemogućavanje praćenja promjena ili predmemoriranje rezultata upita kada želite dohvatiti kupce iz baze podataka bez potrebe za ažuriranjem zapisa.

Ako želite onemogućiti praćenje objekata za tablicu Kupci, možete upotrijebiti sljedeći kôd.

PayrollContext context = new PayrollContext();

Smanjite troškove generiranja prikaza pomoću unaprijed generiranih prikaza

Stvaranje ObjectContext-a skupa je operacija jer uključuje troškove učitavanja i provjere valjanosti metapodataka. Trebali biste iskoristiti unaprijed generirane poglede kako biste smanjili vrijeme odgovora kada se izvrši prvi zahtjev. U osnovi, runtime programa Entity Framework stvara skup klasa (koji se također naziva i prikaz) kada se prvi put instancira kontekst objekta. Te režijske troškove možete smanjiti prethodno generiranjem prikaza za EDMX datoteku pomoću alata za naredbene retke EdmGen.exe ili T4 predloške. Imajte na umu da ako su se datoteke sheme modela promijenile, morat ćete ponovno generirati datoteku pogleda izvršavanjem EdmGen.exe s oznakom / mode: ViewGeneration. Također možete unaprijed generirati poglede s modelom prvog koda.

Onemogući automatsko otkrivanje promjena

Kada pokušava ažurirati bazu podataka, Entity Framework mora znati promjene koje su unesene u entitet od trenutka učitavanja u memoriju. Ovo otkrivanje promjena vrši se uspoređivanjem starih vrijednosti svojstava s novim ili promijenjenim vrijednostima kada uputite poziv metodama poput metoda Pronađi (), Ukloni (), Dodaj (), Priloži () i Spremi promjene (). Ovo otkrivanje promjena vrlo je skupo i može pogoršati performanse aplikacije prvenstveno kada radite s mnogim entitetima. Otkrivanje promjena možete onemogućiti pomoću sljedećeg koda.

Kada želite onemogućiti otkrivanje promjena, dobra je praksa onemogućiti ga unutar bloka try / catch, a zatim ga ponovo omogućiti unutar konačno bloka. Imajte na umu da to možete zanemariti kada radite s relativno malim skupom podataka - značajne dobitke u performansama postigli biste isključivanjem otkrivanja promjena kada radite s velikim skupom podataka.

Ostale točke koje treba imati na umu

Koristite projekcije za odabir samo polja koja su potrebna za dohvaćanje podataka. Trebali biste izbjegavati dohvaćanje nepotrebnih polja.

Sljedeći isječak koda ilustrira kako možete koristiti dohvaćanje podataka na stranični način - imajte na umu kako su indeks početne stranice i veličina stranice korišteni za odabir samo potrebnih podataka.

int pageSize = 25, startingPageIndex = 1;

NorthwindEntities dataContext = new NorthwindEntities();

List lstCus = dataContext.tblCustomers.Take(pageSize)

.Skip(startingPageIndex * pageSize)

.ToList();

Također biste trebali odabrati odgovarajuću zbirku i koristiti kompilirane upite za poboljšanje izvedbe vaših LINQ upita prilikom dohvaćanja podataka izloženih EDM-om. Izbjegavajte povlačenje svih objekata baze podataka u jedan model podataka entiteta. Dohvatite samo potreban broj zapisa i izbjegavajte upotrebu "Sadrži" kada koristite LINQ za entitete. Paging možete koristiti za dohvat samo podataka za koje se traži ili ograničiti količinu podataka koji se preuzimaju iz baze podataka. Također, trebali biste dodati indekse svojim entitetima pozivanjem metode CreateIndex ().

S ove veze možete saznati više o razmatranjima izvedbe kada koristite Entity Framework.