2012-02-14 18 views
4

我意識到這個類似的問題已經被問了幾次,並且我已經嘗試了這些問題中的建議而沒有成功。如何使用實體框架4.3(代碼優先)和SQL Azure數據庫登錄SQL

我正在使用實體框架(4.3)並針對SQL Azure(在聯合數據庫上)運行。我希望能夠記錄實體框架正在生成的SQL。

我已經使用了Entity Profiler Framework,雖然這在開發過程中很有幫助,但我不確定它在生產過程中會有所幫助。

我無法使用SQL Profiler,因爲這是一個SQL Azure數據庫。

我試過使用EFTracingProvider並按照here中的步驟操作。不幸的是,當我嘗試執行我的第一個命令(使用適當的聯邦)時,我收到一個異常,指出「指定的方法不受支持」。

產生錯誤的代碼如下:

public MyContext(int tenantId) 
    : base(CreateTracingConnection("TheDb"), true) 
{ 
    const string FederationCmdText = 
     "USE FEDERATION TenantFederation(CustomerId = {0}) WITH RESET, FILTERING=ON"; 

    ((IObjectContextAdapter)this).ObjectContext.EnableTracing(); 

    ((IObjectContextAdapter)this).ObjectContext.Connection.Open(); 

    // This is the line which throws the exception 
    this.Database.ExecuteSqlCommand(string.Format(FederationCmdText, tenantId));   
} 

這裏的例外:

Specified method is not supported. 
at EFProviderWrapperToolkit.DbConnectionWrapper.CreateDbCommand() 
at System.Data.Common.DbConnection.CreateCommand() 
... 

因此,這裏是我的問題:

  • 是EFTracingProvider爲首選的方法記錄SQL查詢(全局)?
  • 如果是這樣,任何想法,爲什麼我得到上述異常?
  • 如果沒有,是否有另一種機制可以讓我記錄實體框架生成的所有SQL?

感謝您的幫助, 埃裏克

回答

5

的問題,我也陷入了是因爲我相信,在EFTracingProvider沒有直接執行SQL的支持。爲了要解決這個問題,一種解決方案是以下(我在Q &甲發現從here

創建下面的類:

public class DbTracingConnection : EFTracingConnection 
{ 
    protected override DbCommand CreateDbCommand() 
    { 
     return this.WrappedConnection.CreateCommand(); 
    } 
} 

當創建連接時,使用上面的類,而不是的EFTracingConnection。

+0

這似乎是作者推薦的。 [Here](http://efwrappers.codeplex.com/)在他們說的「已知問題」中用'context.Connection.GetStoreConnection()。CreateCommand()'執行存儲命令。所以有效地做你做的,並使用包裝連接:) – slawek 2013-12-16 16:53:30

相關問題