C# 獲取EF savechanges() 的增刪改的SQL語句


如何獲取SaveChanges()的SQL語句。

目的: 在涉及到數據庫的項目中,增刪改是非常關鍵的操作,最好是詳細的記錄到日志中,而詳細 莫過於直接將SQL語句記錄到數據庫日志中了。

像下面這個方法里面的就相當於UPDATE了,屬於關鍵性操作

private void UpdatePredictionState(List<Guid> ids)
        {
            foreach (var id in ids)
            {
                var prediction = _context.PredictionInfos.Find(id);
                prediction.State = 2;
                _context.SaveChanges();
            }
        }

 那么如何獲取_context.SaveChanges()的SQL語句呢?

第一步:展示SQL語句

EF6 有關於日志的一個方法來專門獲取數據庫事務的語句(我也是因為這個才知道什么叫數據庫的事務,之前學過沒有實踐也就忘了-----(事務:簡單來說是數據庫操作中的最小單位,可以看做是一次的增刪改查,不知道這么理解對不對,不對的話 請大神們指教))context.Database.log    這個我在網上查了好久,因為是萌新 不會用!!!!然后我就請教大神了(手動滑稽)。

具體用法如下:

public DownholeToolsTypeController(LoggingJobContext context):base("下井儀器類型")
        {
            _context = context;

            _context.Database.Log = s =>
            {
                Console.WriteLine(s);
            };
        }

將這個寫在控制器的構造器里面,每當運行方法時會先運行構造器然后運行指定的方法,這樣運行方法時,就會監聽有沒有數據庫的事務,有的話就會將事務輸出到控制台上,運行結果如下:

 

 

 這樣會把所有的數據庫事務都寫出來,既然能獲取出來了,那么寫入數據庫就不是很難了。

但是select 不是我們所說的關鍵性記錄啊,我們只要增!刪!改!!!

不難,但是作為萌新,我用了最笨的辦法獲取到了我需要的數據

 _loggingJobContext.Database.Log = s =>
            {
                string sqlstr="";

                if (sw == 1)
                {
                    sqlstr += s;
                }

                if (s.Length > 12)
                {
                    if (s.Substring(0, 6) == "INSERT" || s.Substring(0, 6) == "UPDATE" || s.Substring(0, 6) == "DELETE")
                    {
                        sqlstr += s;
                        sw = 1;
                    }
                    if (s.Substring(0, 13).Contains("Completed") && s.Substring(s.Length - 3, 1) == "1")
                    {
                        sw = 0;
                    }
                }

                _sqlStrBuilder.AppendLine(sqlstr);

  當然 前面的變量:StringBuilder _sqlStrBuilder=new StringBuilder(); int sw = 0;必不可少的。

經過研究發現,打開關閉連接對我們是沒有用的,最有用的其實就是sql語句以數據變量 還有完成結果

這樣就可以只記錄增刪改的操作記錄了;

但是,每一個控制器都要這么寫,麻煩,於是我想簡單一些,叫代碼重用,咋弄呢,我寫了個類,想引用這個類,發現不行,於是請教大神,大神就教我做人了(教我知道什么是父類了,其實知道什么是父類,但是寫的少,壓根沒有往父類上想)

第二步:

代碼重用問題,由於日志問題,大神們已經寫好了父類方法了,但是基本上並沒有SQL語句的方法,於是我把我上面的代碼放到了父類的構造器里面

並在下圖2里面添加了 有關url的語句  這樣 日志就會記載訪問的是哪個url和 sql語句是啥 都有了。

 

 

 上這個圖的目的 也是為了記錄一下,並且讓自己記住,OnActionExecuting和OnActionExecuted的執行先后順序,先執行子類的構造器 然后執行父類的構造器,然后執行OnActionExecuting方法再執行子類的方法,最后執行OnActionExecuted方法。所以最后記錄的方法寫在OnActionExecuted里面是表示着 最終的記錄。

大神最后,給我說了一些知識點,說是要檢查的:知識點我會放在下面,然后如果學習有心得,我會繼續寫博客的。

大神說上述問題有關的知識點:

實例化子類對象時,子類、父類、父父類構造器的執行順序
調用父類構造器的意義
用父類或抽象類類型的變量編程的意義
虛函數

Controller對象的生命周期


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM