Entity Framework - registro de comando

No Entity Framework 6.0, um novo recurso é introduzido, conhecido como Logging SQL. Ao trabalhar com o Entity Framework, ele envia comandos ou uma consulta SQL equivalente ao banco de dados para fazer operações CRUD (Criar, Ler, Atualizar e Excluir).

  • Este recurso do Entity Framework é capturar uma consulta SQL equivalente gerada pelo Entity Framework internamente e fornecê-la como saída.

  • Antes do Entity Framework 6, sempre que havia a necessidade de rastrear consultas e comandos de banco de dados, o desenvolvedor não tinha opção a não ser usar algum utilitário de rastreamento de terceiros ou ferramenta de rastreamento de banco de dados.

  • No Entity Framework 6, esse novo recurso fornece uma maneira simples de registrar todas as operações realizadas pelo Entity Framework.

  • Todas as atividades realizadas pelo Entity Framework são registradas usando DbContext.Database.Log.

Vamos dar uma olhada no código a seguir, no qual um novo aluno é adicionado ao banco de dados.

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 o código acima for executado, você receberá a seguinte saída, que na verdade é o log de todas as atividades realizadas pelo EF no código acima.

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 a propriedade Log é definida, as seguintes atividades são registradas -

  • SQL para todos os diferentes tipos de comandos, por exemplo, consultas, incluindo inserções, atualizações e exclusões geradas como parte de SaveChanges

  • Parameters

  • Se o comando está sendo executado de forma assíncrona ou não

  • Um carimbo de data / hora indicando quando o comando começou a ser executado

  • O comando foi concluído com sucesso ou falhou

  • Alguma indicação do valor do resultado

  • A quantidade aproximada de tempo necessária para executar o comando

Registrando em outro lugar

Se você já tem alguma estrutura de registro e ela define um método de registro, você também pode registrá-lo em outro lugar.

Vamos dar uma olhada no exemplo a seguir, no qual temos outra 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);
   }
}

Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.