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 EFTracingopen 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が出力されていることがわかる。