Entity Framework: registrazione dei comandi
In Entity Framework 6.0, viene introdotta una nuova funzionalità nota come Logging SQL. Mentre lavora con Entity Framework, invia comandi o una query SQL equivalente al database per eseguire operazioni CRUD (creazione, lettura, aggiornamento ed eliminazione).
Questa funzionalità di Entity Framework consiste nell'acquisire una query SQL equivalente generata internamente da Entity Framework e fornirla come output.
Prima di Entity Framework 6, ogni volta che era necessario tracciare query e comandi del database, lo sviluppatore non aveva altra scelta che utilizzare un'utilità di traccia di terze parti o uno strumento di traccia del database.
In Entity Framework 6, questa nuova funzionalità fornisce un modo semplice registrando tutte le operazioni eseguite da Entity Framework.
Tutte le attività eseguite da Entity Framework vengono registrate utilizzando DbContext.Database.Log.
Diamo un'occhiata al seguente codice in cui un nuovo studente viene aggiunto al database.
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();
}
}
}
Quando il codice sopra viene eseguito, riceverai il seguente output, che in realtà è il registro di tutte le attività eseguite da EF nel codice sopra.
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
Quando la proprietà Log è impostata, vengono registrate le seguenti attività:
SQL per tutti i diversi tipi di comandi, ad es. Query, inclusi inserimenti, aggiornamenti ed eliminazioni generati come parte di SaveChanges
Parameters
Indica se il comando viene eseguito in modo asincrono
Un timestamp che indica quando è iniziata l'esecuzione del comando
Il comando è stato completato correttamente o non è riuscito
Qualche indicazione del valore del risultato
Il tempo approssimativo impiegato per eseguire il comando
Accesso in un altro luogo
Se si dispone già di un framework di registrazione e definisce un metodo di registrazione, è possibile anche registrarlo in un altro posto.
Diamo un'occhiata al seguente esempio in cui abbiamo un'altra classe 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);
}
}
Si consiglia di eseguire l'esempio precedente in modo graduale per una migliore comprensione.