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();
}

讲到这里就完了!

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