ADO.NET EFで簡単にSQLをトレースする方法

Linq to SQLでは DataContext.Log というSQLを簡単にトレースできるプロパティが用意されていた。
だが、ADO.NET EFではそのようなプロパティはなく、
もっとも率直にSQLをトレースするならば、個々のクエリに対してObjectQuery.ToTraceStringを呼び出す必要があった。
そうじゃなくてLinq to SQLのようにコンテキストに対してすべてのSQLをトレースできるようにしよう。

デフォルトではそのような機能は提供されていない。
まずは、Entity Framework Tracing Providerをnugetでインストールしよう。
https://nuget.org/packages/CommunityEFProviderWrappers.EFTracingProvider/1.0.0

次に下記のようなコードをF#で用意しておく。


module EFTracing

open System
open System.Data.Objects
open System.Data.EntityClient
open EFProviderWrapperToolkit
open EFTracingProvider


[]
let createTracingConnection (connectionString : string, tracer : Action) =
EFTracingProvider.EFTracingProviderFactory.Register() |> ignore
let conn =
EntityConnectionWrapperUtils.CreateEntityConnectionWithWrappers(connectionString, "EFTracingProvider")

let tracingConnection = conn.UnwrapConnection()
tracingConnection.CommandExecuting.AddHandler (fun sender e -> e.ToTraceString () |> tracer.Invoke)
conn

そして下記のように使えば簡単にSQLをトレースすることができる。


// 第二引数にSQLを受け取るActionを渡す。
var conn = EFTracing.CreateTracingConnection("name=SampleEntities", Console.WriteLine);

using (var ctx = new SampleEntities(conn))
{
ctx.AddToProducts(new Products() { Name = "Microsoft Surface"});
ctx.SaveChanges();
}

結果は、このようにConsoleにSQLが出力されていることがわかる。