私はこれを、ObjectContextの周りにラッパークラスを作成し、元のコンテキストの代わりにそのラッパーを使用して作成しました。
また、トレース出力メソッドを定義し、トレースを初期化する静的メソッドがあります。ここでは:
public static class EFTracingExtensions
{
private static ILogger _logger;
public static void InitSqlTracing(ILogger logger)
{
_logger = logger;
EFTracingProviderConfiguration.RegisterProvider();
if (logger.IsLoggingEnabled()) // Don't add logging hooks if logging isn't enabled
{
EFTracingProviderConfiguration.LogAction = new Action<CommandExecutionEventArgs>(AppendSqlLog);
}
}
private static void AppendSqlLog(CommandExecutionEventArgs e)
{
if (e.Status != CommandExecutionStatus.Executing) // we only care about Finished and Failed
{
StringBuilder msg = new StringBuilder(e.ToTraceString().TrimEnd());
msg.Append(Environment.NewLine);
if (e.Result is SqlDataReader)
{
int rows = ((SqlDataReader)e.Result).HasRows ? ((SqlDataReader)e.Result).RecordsAffected : 0;
msg.AppendFormat("*** {0} rows affected", rows);
}
else if (e.Result is int)
{
msg.AppendFormat("*** result: {0}", e.Result);
}
else
{
msg.AppendFormat("*** finished, result: {0}", e.Result);
}
msg.Append(Environment.NewLine);
msg.AppendFormat(" [{0}] [{1}] in {2} seconds", e.Method, e.Status, e.Duration);
_logger.Log(msg.ToString(), LoggerCategories.SQL);
}
}
}
ILoggerは私が使用しているロギングインターフェイスです。独自のインターフェース/メソッドを置き換える必要があります。
プログラムの起動時にInitSqlTracingメソッドが呼び出され、LoggedContextクラスを使用してEntity Frameworkによって生成されたすべてのSQLがログに記録されます。
はあなたのサンプルコードと一緒にすべてを置く:私の問題のため
EFTracingExtensions.InitSqlTracing(logger); // only call this once
using (var context = new LoggedContext())
{
var a = from data in context.Projects select data;
}
これは移行の一部としては機能していないようです。私はその解決策を探しています。 – aikeru