Entity Framework 6–Gerando Log dos comandos SQL

Olá,

O Entity Framework 6 RC já foi lançado! Agora é a hora de começar a trabalhar na migraçãoda versão 5 para a 6 e ver as novas funcionalidades. As especificações sobre as novas funcionalidades podem ser encontradas aqui.

Dentre as muitas novidades, que vamos explorar nos post seguintes, hoje vou destacar uma que acho bem interessante: o log dos comandos enviados ao banco de dados.

Um ORM (Object-Relational Mapping), ou simplesmente um Mapeamento Objeto-Relacional traduz comandos de uma linguagem de programação, no nosso caso C# e LINQ, para comandos de banco de dados. A eficiência do ORM está diretamente relacionada a como os comandos para o banco de dados são gerados, ou seja, pegar os comandos escritos em C# e convertê-los em comandos SQL.

Na versão 6 do Entity Framework foi introduzido um novo objeto que nos permite interceptar os comandos que estão sendo enviados para o banco de dados e assim podemos ver o que acontece “por baixo dos panos”. Isto também podem ser feito colocando uma ferramenta de profiler de banco de dados. No caso do Microsoft SQL Server esta ferramenta é o SQL Server Profiler, mas existem vários outros.

No caso do nosso exemplo, vamos executar um método para cada operação em LINQ que será executada no Entity Framework, e para iniciarmos o nosso exemplo, vamos criar um projeto do tipo Console Application usando o .Net 4.5 (o uso do .Net 4.5 é importante para suportar todas as funcionalidades do Entity Framework 6).

Criando um novo projeto do tipo Console Application:

SNAGHTML476eb602

Criado o nosso projeto, vamos adicionar o Entity Framework através da janela do  Nuget, que está em Tools/Library Packager Manager/Packager Manger Console e dentro dele iremos executar o comando abaixo:

PM> Install-Package EntityFramework –Pre

Veja que a opção “-Pre” é quem irá instalar o Entity Framework 6 RC, visto que ele ainda não foi liberado oficialmente e ainda é um release candidate.

Agora vamos criar um contexto bem simples com uma classe Cliente. Para isto adicione uma nova classe e chame-a de Contexto, como no exemplo abaixo:

   1: public class Contexto : DbContext

   2: {

   3:     public DbSet<Cliente> Cliente {get; set;}

   4:  

   5: }

Agora vamos adicionar a classe Cliente:

   1: public class Cliente

   2:     {

   3:         public int ID { get; set; }

   4:         public string Nome { get; set; }

   5:     }

E por fim vamos modificar o arquivo App.Config para direcionarmos o local e o nome do banco de dados a ser criado: (isto é somente um exemplo e o seu arquivo poderá ficar diferente)

   1: <?xml version="1.0" encoding="utf-8"?>

   2: <configuration>

   3:   <connectionStrings>

   4:     <add name="Contexto" connectionString="data source=(local); initial catalog=EFLog; integrated security=true;" providerName="System.Data.SqlClient"/>

   5:   </connectionStrings>

   6: </configuration>

Agora vamos ao que interessa, ou seja, vamos adicionar o LOG do SQL. Para isto, no Program.cs vamos inserir os seguintes comandos:

   1: class Program

   2:     {

   3:         static void Main(string[] args)

   4:         {

   5:             var db = new Contexto();

   6:             db.Database.Log = GravaLog;

   7:  

   8:             var cli = new Cliente() { Nome = "Carlos" };

   9:             db.Cliente.Add(cli);

  10:             db.SaveChanges();

  11:  

  12:             var consulta = from c in db.Cliente

  13:                            select c;

  14:             foreach(var c in consulta)

  15:             {

  16:                 Console.WriteLine(c.Nome);

  17:             }

  18:         }

  19:  

  20:         public static void GravaLog(string sql)

  21:         {

  22:             Console.WriteLine("Comando SQL: "+sql);

  23:         }

  24:     }

O método GravaLog() é atrbuído a propriedade Log do DataBase do Contexto, sendo assim, todos os comandos enviados para o banco de dados são também enviados para este método e dentro dele simplesmente chamamos o método Console.WriteLine() para mostrar os comandos na tela.

Ao executar o programa, você verá algo como a imagem abaixo:

SNAGHTML47817c48

Esta é uma implementação bastante simples da implementação do Log de comandos disponível agora na versão 6, mas com certeza você poderá utilizar de uma maneira bem mais elaborada em seus projetos.

Abraços e até a próxima,
Carlos dos Santos.

3 Comments

  1. Rodrigo says:

    Bom dia Carlos, sabe, muito legal ver o entity framework crescendo, eu não sou tão velho no .net, sou novo, rsrs, mas sempre utilizei o Nhibernate…
    É uma discussão inútil falar qual é melhor, qual é pior, etc…

    Mas com a versão do EF 6 você poderia me dar um motivo para usa-lo em vez do nhibernate? rsrsrs Estou com um novo projeto para desenvolver e será em mvc5 aonde tem o asp.net identity que trabalha muito bem com o EF, por isso to em cima do muro…Mas também posso reescrever a classe idetity para usar o Nhibernate…rsrs

    Se puder responder fico muito grato.
    :)

  2. Cezar says:

    uhul, agora só falta funcionar bem em outros bancos, além do sql server, por que isso até hoje não vi sendo feito, até hoje não consegui fazer gerar um simples banco de dados (postgress) com o EF, rsrsrs, parabéns pelo post, espero que a versão 6 funcione bem com outros bancos, não só com sql server, rsrsrs

Leave a Reply

In an effort to prevent automatic filling, you should perform a task displayed below.


WP-SpamFree by Pole Position Marketing