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.