Pokazywanie postów oznaczonych etykietą entity framework. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą entity framework. Pokaż wszystkie posty

piątek, 18 września 2015

Entity Framework jak działa metoda Include [c#]

Niebezpieczeństwa w używaniu metody Include podczas budowania zapytań



Kiedy zaczynamy zabawę z Entity Framework'iem w .NET'cie wszystko wydaje się na prawdę proste. Piszemy co chcemy wyciągnąć za pomocą składni LINQ robimy np. wykonujemy zapytanie i już mamy wyciągnięte dane. Lecz do końca nie jest tak różowo jak się nam wydaje. Entity Framework ma taką naturę, że jeśli przestaniemy mu patrzeć na ręce bardzo szybko może nas wprowadzić w poważne tarapaty. Bardzo dobrym pomysłem jest zainstalowanie sobie darmowego Express Profiler i podglądanie jakie zapytania zostają wysyłane do bazy. Czasem na prawdę można się przestraszyć jakie potwory musi przetrawić baza. Począwszy od kilku zagnieżdżeń aż po kilometrowe SELECTy. Trzeba uważać w szczególności na metodę Include, która jest super narzędziem, lecz należy dołączać STARANNIE wyselekcjonowane dane. Trzeba uważać na długie ścieżki. Zamiast pisać

...Include("Osoba").Include("Osoba.Kraj").Include("Osoba.Kraj.Zdjecie")

lepiej jest:

.Include("Osoba.Kraj.Zdjecie")

Wygenerowane zapytanie jest mniejsze a im mniejsze tym lepsze. Dlatego też jeśli to możliwe obcinać SELECTy przez określenie jakie kolumny nas interesują .Select(p => .....)

niedziela, 8 marca 2015

[c#] Entity Framework - Wypisanie wygenerowanych zapytań na ekran

Nie raz podczas pracy z Entity Framework chcemy podejrzeć jak wyglądają wygenerowane zapytania SQL. Może coś nie działa jak tego byśmy chcieli, lub szukamy sposobu optymalizacji zapytania. Na szczęście Entity Framework został bardzo dobrze przemyślany i takie podglądnięcie wygenerowanego/surowego sqla nie stanowi żadnego problemu:

using(var content = new DatabaseContext())

{
  context.Database.Log = Console.Write;
  var user = context.Users.First(); // na ekran trafi wygenerowany select wyciągający pierwszego usera z tablicy
}
 
prawda, że proste? A co jeśli chcielibyśmy zapisywać sobie te zapytania do pliku, aby np. móc przewkleić je do jakiegoś managera SQL w celu analizy? Chłopaki od Entity Frameworka, też o tym pomyśleli:

1) Najpierw trzeba utworzyć swojego Loggera (nic trudnego)

public class Logger
{
  public void Log(string message)
  {
    // w tym miejscu można użyć dowolnej biblioteki do logowania np. log4net, nlog etc
    File.AppendAllText("log.txt", message + Environment.NewLine); 
  }
}

2) Następnie podczepiamy loggera do contextu:

var logger = new Logger();
context.Database.Log = sql => logger.Log(sql);

Gotowe, możemy teraz się cieszyć zapisanym sqlem w logu.