2019年2月15日金曜日

[.NET]EntityFrameWorkのSQLログを好きな箇所で保存する

EntityFrameWorkでSQLログを取りたい時、以下の様に書けばいいが

db.Database.Log = sql => { Debug.Write(sql); };
これだと同じdb内で処理したところすべてのSQLを取ってしまう。
(どうでもいいSELECT文とか…UPDATEだけでいいのに的な)

①Using等でくくったところだけ、SQLログを取るようにしたかったので
 以下のようなクラスを作成。
-----------------------------------------------------------------------------
public partial class EFlogSave : IDisposable
    {
        bool flgWrite = false;

        string tmp = true;  //一時的に採取をやめる場合はここをfalseに
        bool flgConfig;       
        string strSQLLog = string.Empty;
        public EFlogSave(DbContext db, bool flg = true, string strHeadtext = null)
        {
            if (bool.TryParse(tmp, out flgConfig))
            {
                if (flg && flgConfig) { flgWrite = true; }
            };
            if (flgWrite)
            {
                if (strHeadtext != null) { strSQLLog = strHeadtext; }
                db.Database.Log = x => { strSQLLog += x; };              
            }
        }
        public EFlogSave(DbContext db, string strHeadtext )
        {
            if (bool.TryParse(tmp, out flgConfig))
            {
                if (flgConfig) { flgWrite = true; }
            };
            if (flgWrite)
            {
                if (strHeadtext != null) { strSQLLog = strHeadtext; }
                db.Database.Log = x => { strSQLLog += x; };
            }
        }
        //dispose周り---------------
        bool disposed = false;
        SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        protected virtual void Dispose(bool disposing)
        {
            if (disposed)
                return;
            if (disposing)
            {
                handle.Dispose();
                // Free any other managed objects here.
            }
            //SQLログを吐き出す
            if (flgWrite) { Debug.Write(strSQLLog); }
            disposed = true;
        }
}
--------------------------------------------------------------------------
Usingでくくっておいて、disposeする時にSQL文を吐き出す、という仕組み。

②実際のコードでの使い方は以下。
---------------------------------------------------------------------------
using (var db = new HogeDBEntities())
{
var updRow = db.T_てすと.Where(d => d.番号 == 12345).FirstOrDefault()

using (new EFlogSave(db))   // SQLログを取る時のみ指定
{
updRow.状態区分 = 3;
db.SaveChanges();
}
}
---------------------------------------------------------------------------
EFlogSaveでくくった、UPDATEの箇所だけSQLを吐き出してくれる。

0 件のコメント:

コメントを投稿