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 件のコメント:
コメントを投稿