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