一、用數據庫監視看
先排除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();
}
講到這裏就完了!