開始
EF6.1也出來不少日子了,6.1相比6.0有個很大的特點就是新增了System.Data.Entity.Infrastructure.Interception 命名空間,此命名空間下的對象可以允許我們更加方便的了解到EF運行時的一些信息,當然我們最想看的還是EF生成的Sql語句,話不多講,開始干吧;
class EFIntercepterLogging : DbCommandInterceptor { private readonly Stopwatch _stopwatch = new Stopwatch(); public override void ScalarExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext) { base.ScalarExecuting(command, interceptionContext); _stopwatch.Restart(); } public override void ScalarExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext) { _stopwatch.Stop(); if (interceptionContext.Exception != null) { Trace.TraceError("Exception:{1} \r\n --> Error executing command: {0}", command.CommandText, interceptionContext.Exception.ToString()); } else { Trace.TraceInformation("\r\n執行時間:{0} 毫秒\r\n-->ScalarExecuted.Command:{1}\r\n", _stopwatch.ElapsedMilliseconds, command.CommandText); } base.ScalarExecuted(command, interceptionContext); } public override void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { base.NonQueryExecuting(command, interceptionContext); _stopwatch.Restart(); } public override void NonQueryExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { _stopwatch.Stop(); if (interceptionContext.Exception != null) { Trace.TraceError("Exception:{1} \r\n --> Error executing command:\r\n {0}", command.CommandText, interceptionContext.Exception.ToString()); } else { Trace.TraceInformation("\r\n執行時間:{0} 毫秒\r\n-->NonQueryExecuted.Command:\r\n{1}", _stopwatch.ElapsedMilliseconds, command.CommandText); } base.NonQueryExecuted(command, interceptionContext); } public override void ReaderExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext) { base.ReaderExecuting(command, interceptionContext); _stopwatch.Restart(); } public override void ReaderExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext) { _stopwatch.Stop(); if (interceptionContext.Exception != null) { Trace.TraceError("Exception:{1} \r\n --> Error executing command:\r\n {0}", command.CommandText, interceptionContext.Exception.ToString()); } else { Trace.TraceInformation("\r\n執行時間:{0} 毫秒 \r\n -->ReaderExecuted.Command:\r\n{1}", _stopwatch.ElapsedMilliseconds, command.CommandText); } base.ReaderExecuted(command, interceptionContext); } }
上面這段代碼需要命名空間:
using System.Data.Entity.Infrastructure.Interception;
using System.Diagnostics;
從方法名我們可以看出大致就三類:讀取類的sql,[Reader],非讀取類的sql,[NonQuery],還有[Scalar],這類用的比較少,跟原始的ADO.NET命令類型基本一樣,不多講.每個sql語句類型的方法都有執行前Executing,執行后Executed,從命名上我們就可以看出AOP的身影哈,接下來看如何使用它...
嗯,對沒錯,就是這么簡單,當然你還可以把紅線里那句代碼放在Global文件里.
我們看看運行效果
個人感覺是比用什么插件,第三方類庫,SqlProfile什么的方便點點,用博客園的Google搜索了一下,貌似沒發現其他園友寫這個方法,可能是太簡單了,都不願意寫,還是麻煩推薦一下讓更多的園友看到!