2011-10-26 60 views
8

當使用實體框架進行SQL通信時,我有一個奇怪的響應時間模式。調試實體框架SQL語句

這是從我的虛擬主機:

enter image description here

這是從我的本地服務器:

enter image description here

它的響應時間,我很擔心的增加。 我已經將問題縮小到代碼 Nop.Data> EfRepository.cs> public void Insert(T entity)> _entities.Add(entity); 是的,我知道這是非常具體的NopCommerce,但重點是真的,我正在尋找她如何調試這個幫助。

是否有一些事件可以捕獲,顯示正在執行的SQL? 或者我可以做什麼其他事情來了解更多在上述命令中實體框架中實際發生的事情。

回答

21

對於調試EF查詢,最簡單的事情就是查詢轉換爲的ObjectQuery和使用ToTraceString:

var query = myContext.MyTable 
    .Where(r => r.Id == searchId) 
    .Select(r => r); 

Console.WriteLine(((ObjectQuery)query).ToTraceString()); 

這將顯示該查詢的基礎SQL,並且可以手動運行查詢調試爲什麼他們很慢。這裏是MSDN鏈接:

http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx

如果你正在試圖獲得,當你在你的情況下調用的SaveChanges()運行該SQL,它不是那麼容易的。你可以在EFTracingProvider看一看:

http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx

或者,假設你使用SQL Server,你可以直接到SQL事件探查器,並捕獲T-SQL語句(這是我的首選方法)。

+0

謝謝,我會嘗試第一個,因爲SaveChanges()調用似乎不需要那麼多時間,至少我寫的這一行花了很多時間。 由於主機的限制,我不能使用Profiler(我試過)。 – Anders

+0

我發現問題的部分內容是關於將對象轉換爲特定類的代碼。所以這個問題可能不是SQL相關的 – Anders