Entity Framework: registro de comandos

En Entity Framework 6.0, se introduce una nueva característica que se conoce como Logging SQL. Mientras trabaja con Entity Framework, envía comandos o una consulta SQL equivalente a la base de datos para realizar operaciones CRUD (Crear, Leer, Actualizar y Eliminar).

  • Esta característica de Entity Framework es capturar una consulta SQL equivalente generada por Entity Framework internamente y proporcionarla como salida.

  • Antes de Entity Framework 6, siempre que existía la necesidad de rastrear las consultas y los comandos de la base de datos, el desarrollador no tenía otra opción que utilizar alguna utilidad de rastreo de terceros o una herramienta de rastreo de la base de datos.

  • En Entity Framework 6, esta nueva característica proporciona una forma sencilla de registrar todas las operaciones realizadas por Entity Framework.

  • Todas las actividades que realiza Entity Framework se registran mediante DbContext.Database.Log.

Echemos un vistazo al siguiente código en el que se agrega un nuevo estudiante a la base de datos.

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();
      }
   }
}

Cuando se ejecuta el código anterior, recibirá el siguiente resultado, que en realidad es el registro de todas las actividades realizadas por EF en el código anterior.

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

Cuando se establece la propiedad Log, se registran las siguientes actividades:

  • SQL para todos los diferentes tipos de comandos, por ejemplo, consultas, incluidas inserciones, actualizaciones y eliminaciones generadas como parte de SaveChanges

  • Parameters

  • Si el comando se está ejecutando de forma asincrónica o no

  • Una marca de tiempo que indica cuándo comenzó a ejecutarse el comando

  • El comando se completó con éxito o falló

  • Alguna indicación del valor del resultado

  • La cantidad aproximada de tiempo que tomó ejecutar el comando

Registro en otro lugar

Si ya tiene un marco de registro y define un método de registro, también puede registrarlo en otro lugar.

Echemos un vistazo al siguiente ejemplo en el que tenemos otra clase 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);
   }
}

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprensión.