2012-02-14 14 views
4

を使用してSQLをログする方法この類似の質問が何度か尋ねられていることを認識しています。エンティティフレームワーク4.3(コードファースト)とSQL Azureデータベース

エンティティフレームワーク(4.3)を使用し、SQL Azure(フェデレーションデータベース上)に対して実行しています。私はエンティティフレームワークによって生成されているSQLを記録できるようにしたいと思います。

私はEntity Profiler Frameworkを使用しましたが、これは開発中に役立ちますが、生産中に役立つかどうかはわかりません。

これはSQL Azureデータベースなので、SQLプロファイラは使用できません。

私は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));   
} 

だ例外:

  • がための好ましいアプローチEFTracingProviderです:だからここ

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

    が私の質問です

    エラーを生成するコードは以下のとおりです。 SQL問合せを(グローバルに)記録しますか?

  • もしそうなら、上記の例外が発生する理由は何ですか?
  • そうでない場合は、Entity Frameworkによって生成されたSQLをすべてログに記録できるもう1つのメカニズムがありますか?あなたの助けのための

おかげで、 エリック

答えて

5

EFTracingProviderは直接SQLを実行するためのサポートを持っていない、私は信じている、ので、私はにして実行していた問題。接続を作成するとき

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

が、代わりに上記のクラスを使用します。その問題を回避するためには、1つの解決策は、以下のクラスを作成します

(私はhereからQ & Aで見つかった)次のようですEFTracingConnectionの

+0

これは著者らも同様に推奨されているようです。 [Here](http://efwrappers.codeplex.com/)の「既知の問題」で、「context.Connection.GetStoreConnection()。CreateCommand()」によってストアコマンドを実行すると言っています。あなたがやったことを効果的にやって、ラップされた接続を使用してください:) – slawek

関連する問題