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.