c# ASP.NET怎麼看EF生成的SQL語句和EF執行的所有活動

一、用數據庫監視看

先排除EF自身的另一種方法看EF執行的SQL語句

方法:使用sqlserver中的sqlprofiler 監測工具,這個每次執行都會得到相應的sql的

工具》SQL Server Profiler》

第一步:連接

第二步:直接默認,直接點“運行

如果有數據庫操作就可以看到了,

如果你嫌棄,記錄太多,你可以在

菜單欄》編輯》清除跟蹤窗口

或者

菜單欄下邊的工具欄上面有個橡皮檫,也是“清除跟蹤窗口”的功能

二、關於EF的

   在EF 6之前,我們使用數據庫跟蹤工具或第三方跟蹤實用程序跟蹤由Entity Framework發送的數據庫查詢和命令。 現在,EF 6提供了一個簡單的機制來記錄Entity Framework所做的一切。 它使用context.database.Log記錄EF執行的所有活動。

完整代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;

namespace HaoSiJia.DAL
{
    public class ProductDAL
    {

        /// <summary>
        /// 增加產品
        /// </summary>
        /// <param name="productType"></param>
        /// <returns>1:成功</returns>
        public int ProductAdd(Product product, out int Id)
        {

            using (HaoSiJiaEntities hsjDB = new HaoSiJiaEntities())
            {
                //清除所有字符信息
                Logger.sb.Clear();

                //記錄EF執行的所有活動
                hsjDB.Database.Log =  Logger.Log; 

                Product _product = new Product();
                _product = product;
                hsjDB.Product.Add(_product);
               
            
                try
                {
                    if (hsjDB.SaveChanges() > 0)
                    {
                        Id = _product.ProductID;
                        return 1;
                    }
                    else
                    {
                        Id = 0;
                        return 0;
                    }
                }
                catch (Exception ex)
                {
                    //捕獲EF信息,寫進日誌文件裏
                    LogHelper.Error(Logger.sb.ToString());
                    //捕獲異常信息,寫進日誌文件裏
                    ex.RecordErrorLog();
                    Id = 0;
                    return 0;
                }

            }
        }


    }

    public class Logger
    {
        //存放EF信息
      public static StringBuilder sb=new StringBuilder();
        //記錄EF信息的方法
        public static void Log(string message)
        {
            sb.Append(message); 
        }
    }
}

我們在頂部

 //記錄EF執行的所有活動
hsjDB.Database.Log =  Logger.Log; 

hsjDB.Database.Log這個語句是記錄EF執行的所有活動

重點:代碼會執行到

try
{
 if (hsjDB.SaveChanges() > 0)
 {

這裏的時候,去執行Logger.Log方法;

下面這段代碼

//存放EF信息
public static StringBuilder sb=new StringBuilder();

如註釋所說,是存放信息的;

記錄EF的完整信息如下

Logger.sb	
{
Opened connection at 2020/6/12 星期五 15:41:34 +08:00
Started transaction at 2020/6/12 星期五 15:41:34 +08:00
INSERT [dbo].[Product]([ProductTypeID], [Name], [Price], [Summary], [Detail], [Status], [Is_top], [Is_red], [Is_hot], [Add_time], [Update_time], [Sort_id], [I_Click], [Image_url])
VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13)
SELECT [ProductID]
FROM [dbo].[Product]
WHERE @@ROWCOUNT > 0 AND [ProductID] = scope_identity()
-- @0: '2' (Type = Int32)
-- @1: '錘子1' (Type = AnsiString, Size = 500)
-- @2: '1' (Type = Decimal, Precision = 10, Scale = 2)
-- @3: '內容摘要內容摘要' (Type = AnsiString, Size = 500)
-- @4: '<p>
內容描述
</p>
<p>
內容描述
</p>
<p>
內容描述
</p>
<p>
內容描述
</p>
<p>
內容描述
</p>' (Type = AnsiString, Size = -1)
-- @5: '1' (Type = Int32)
-- @6: 'False' (Type = Boolean)
-- @7: 'False' (Type = Boolean)
-- @8: 'True' (Type = Boolean)
-- @9: '2020/6/12 星期五 15:40:37' (Type = DateTime2)
-- @10: '2020/6/12 星期五 15:41:27' (Type = DateTime2)
-- @11: '99' (Type = Int32)
-- @12: '1' (Type = Int32)
-- @13: '/File/Upload/image/20200612/20200612154102_2844.png' (Type = AnsiString, Size = 300)
-- Executing at 2020/6/12 星期五 15:41:34 +08:00
-- Completed in 29 ms with result: SqlDataReader

Committed transaction at 2020/6/12 星期五 15:41:34 +08:00
Closed connection at 2020/6/12 星期五 15:41:34 +08:00
}	System.Text.StringBuilder

獲取信息的方法是: Logger.sb.ToString()

如果是控制檯

using (var context = new SchoolDBEntities())
{
    context.Database.Log = Console.Write;//記錄EF活動,並輸出
    var student = context.Students
                        .Where(s => s.StudentName == "Student1").FirstOrDefault<Student>();

    student.StudentName = "Edited Name";
    context.SaveChanges();
}

講到這裏就完了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章