当前位置 : 主页 > 网络编程 > net编程 >

c# ASP.NET怎么看EF生成的SQL语句和EF执行的所有活动

来源:互联网 收集:自由互联 发布时间:2023-09-07
一、用数据库监视看 先排除EF自身的另一种方法看EF执行的SQL语句 方法:使用sqlserver中的sqlprofiler 监测工具,这个每次执行都会得到相应的sql的 工具》SQL Server Profiler》 第一步:连接

一、用数据库监视看

先排除EF自身的另一种方法看EF执行的SQL语句

方法:使用sqlserver中的sqlprofiler 监测工具,这个每次执行都会得到相应的sql的

工具》SQL Server Profiler》

第一步:连接

第二步:直接默认,直接点“运行”

如果有数据库操作就可以看到了,

如果你嫌弃,记录太多,你可以在

菜单栏》编辑》清除跟踪窗口

或者

菜单栏下边的工具栏上面有个橡皮檫,也是“清除跟踪窗口”的功能

c# ASP.NET怎么看EF生成的SQL语句和EF执行的所有活动_数据库

c# ASP.NET怎么看EF生成的SQL语句和EF执行的所有活动_数据库_02

二、关于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();
}

讲到这里就完了!


网友评论