Łukasz Gąsior
  • Home
  • now!
  • Blog
  • Po polsku
Social Links
Twitter
LinkedIn
Facebook
YouTube
Reddit
Instagram
GitHub
Medium
RSS
Łukasz Gąsior
  • Home
  • now!
  • Blog
  • Po polsku
  • Po polsku

Quick tip: 12. Stosuj AsNoTracking() gdzie się da!

  • 2013-01-27
  • 3 komentarze
  • 1 minute read
  • 536 views

Dzisiaj krótko o tym, jak poprawić wydajność pobierania danych z wykorzystaniem Entity Framework.

Entity Framework ma wbudowany mechanizm śledzenia zmian na obiektach. Dzięki niemu Entity Framework wie, który obiekt jest nowy i że trzeba go dodać do bazy, co można zaktualizować, jakie referencje usunąć, zmienić, itp. Ficzer niby fajny, ale często przeszkadza – szczególnie, jeżeli dane chcemy jedynie pobrać i wiemy, że nie będziemy ich modyfikować.

Problemem mechanizmu śledzenia jest narzut czasu i pamięci na wszystkie operacje. Dzieje się tak, ponieważ Entity Framework tworzy kopię obiektów pobieranych z bazy, a następnie porównuje je z obiektami, na których pracujemy. Samo porównanie wywoływane jest bardzo często, ale można je łatwo wyłączyć:

context.Configuration.AutoDetectChangesEnabled = false;

Problem w tym, że ten kod wyłącza jedynie automatyczne śledzenie, ale zmiany możemy zawsze wykryć ręcznie wywołując:

context.MyEntities.DetectChanges();

Oznacza to, że Entity Framework i tak tworzy kopie obiektów, przez co i tak tracimy na wydajności i wykorzystanej pamięci.

W sytuacjach, w których jedynie pobieramy dane z bazy (aby je później wyświetlić) należy w zapytaniu użyć metody AsNoTracking():

using (var context = new MyContext())
{
    var entities = context.MyEntities.AsNoTracking().Where(e => e.IsActive);
}

Metoda ta całkowicie wyłączy mechanizm śledzenia, ale tylko w tym zapytaniu. Niestety nie ma możliwości ustawienia takiej reguły globalnie.

Share
Tweet
Share
Share
Related Topics
  • AsNoTracking
  • Entity Framework
  • optymalizacja
  • Tracking
You May Also Like
View Post
  • Po polsku

Software Craftsmanship Wrocław

  • 2017-06-06
View Post
  • Po polsku

Pilnuj typów danych

  • 2014-02-26
View Post
  • Po polsku

ReSharper Essentials – poszło!

  • 2014-02-21
View Post
  • Po polsku

Turbo-Mode Developera

  • 2014-02-19
View Post
  • Po polsku

Badanie usability by TechSmith

  • 2014-02-13
View Post
  • Po polsku

Global Windows Azure Bootcamp 2014

  • 2014-02-05
View Post
  • Po polsku

Quick tip: 11. Indexed views vs. SQL Server Express

  • 2012-07-23
View Post
  • Po polsku

Roy uczy TDD :)

  • 2012-07-03
3 comments
  1. Pingback: dotnetomaniak.pl
  2. Grzegorz Kotfis pisze:
    2013-01-28 o 08:36

    Alternatywnie można także użyć właściwości MergeOption = NoTracking, np.
    var entities = context.MyEntities.MergeOption = NoTracking;
    Na czas życia kontekstu wyłączy śledzenie zmian.

  3. Łukasz Gąsior pisze:
    2013-01-28 o 21:11

    Tak ale to rozwiązanie nie zadziała w przypadku klas POCO.

Comments are closed.

click & help!
Nakarm dziecko!
Follow me
RESHARPER ESSENTIALS
ReSharper Essentials
CODINGTV();
codingtv();
Twitter Feed
Categories
  • Azure Cloud (6)
  • Po polsku (104)
  • Windows (1)
Featured Posts
  • Azure Activity Log – Change History
    • 2020-09-29
  • Diagram Driven Cloud Infrastructure with Cloud Maker
    • 2020-09-22
  • Azure ARM template, but it is not JSON!
    • 2020-09-15
About
👍 Cloud | DevOps | Development | Technical Leadership | 📗Author of "ReSharper Essentials
© 2019 Łukasz Gąsior. All rights reserved.
hosted with ♥️ on webio | Polityka prywatności

Input your search keywords and press Enter.