Entity Framework - rejestrowanie poleceń

W Entity Framework 6.0 została wprowadzona nowa funkcja, znana jako Logging SQL. Podczas pracy z Entity Framework wysyła polecenia lub równoważne zapytanie SQL do bazy danych w celu wykonania operacji CRUD (tworzenie, odczytywanie, aktualizowanie i usuwanie).

  • Ta funkcja Entity Framework polega na przechwytywaniu równoważnego zapytania SQL generowanego przez Entity Framework wewnętrznie i udostępnianiu go jako danych wyjściowych.

  • Przed Entity Framework 6, ilekroć istniała potrzeba śledzenia zapytań i poleceń bazy danych, deweloper nie miał innego wyjścia, jak tylko użyć narzędzia do śledzenia innej firmy lub narzędzia do śledzenia bazy danych.

  • W Entity Framework 6 ta nowa funkcja zapewnia prosty sposób, rejestrując wszystkie operacje wykonywane przez Entity Framework.

  • Wszystkie działania wykonywane przez Entity Framework są rejestrowane przy użyciu DbContext.Database.Log.

Przyjrzyjmy się poniższemu kodowi, w którym nowy uczeń jest dodawany do bazy danych.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         context.Database.Log = Console.Write;

         // Create a new student and save it

         context.Students.Add(new Student {
            FirstMidName = "Salman", 
            LastName = "Khan", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         });

         context.SaveChanges();
         Console.ReadKey();
      }
   }
}

Po wykonaniu powyższego kodu otrzymasz następujące dane wyjściowe, które są w rzeczywistości dziennikiem wszystkich działań wykonanych przez EF w powyższym kodzie.

Opened connection at 10/28/2015 6:27:35 PM +05:00
Started transaction at 10/28/2015 6:27:35 PM +05:00
INSERT [dbo].[Student]([LastName], [FirstMidName], [EnrollmentDate])
VALUES (@0, @1, @2)
SELECT [ID]
FROM [dbo].[Student]
WHERE @@ROWCOUNT > 0 AND [ID] = scope_identity()
-- @0: 'Khan' (Type = String, Size = -1)
-- @1: 'Salman' (Type = String, Size = -1)
-- @2: '10/28/2015 12:00:00 AM' (Type = DateTime)
-- Executing at 10/28/2015 6:27:35 PM +05:00
-- Completed in 5 ms with result: SqlDataReader
Committed transaction at 10/28/2015 6:27:35 PM +05:00
Closed connection at 10/28/2015 6:27:35 PM +05:00

Gdy właściwość Log jest ustawiona, rejestrowane są następujące działania -

  • SQL dla wszystkich rodzajów poleceń, np. Zapytań, w tym wstawiania, aktualizacji i usuwania generowanych w ramach SaveChanges

  • Parameters

  • Czy polecenie jest wykonywane asynchronicznie

  • Znacznik czasu wskazujący, kiedy polecenie zaczęło się wykonywać

  • Polecenie zostało wykonane pomyślnie lub nie powiodło się

  • Pewne wskazanie wartości wyniku

  • Przybliżona ilość czasu potrzebna do wykonania polecenia

Logowanie do innego miejsca

Jeśli masz już strukturę rejestrowania i definiuje metodę logowania, możesz również zarejestrować ją w innym miejscu.

Spójrzmy na poniższy przykład, w którym mamy inną klasę MyLogger.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         context.Database.Log = s ⇒ MyLogger.Log("EFLoggingDemo", s);

         // Create a new student and save it

         context.Students.Add(new Student {
            FirstMidName = "Salman", 
            LastName = "Khan", 
            EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
         });

         context.SaveChanges();
         Console.ReadKey();
      }
   }
}

public class MyLogger {

   public static void Log(string application, string message) {
      Console.WriteLine("Application: {0}, EF Message: {1} ",application, message);
   }
}

Zalecamy wykonanie powyższego przykładu krok po kroku w celu lepszego zrozumienia.