2016-04-21 16 views
21

を呼び出す前に、挿入のために生成されるSQLを表示することができ、それは、前に呼び出すSaveChangesメソッドを挿入するために実行されるSQLを表示することは可能でしょうか?Entity Frameworkの6 - どのように私は、Entity Frameworkを6でのSaveChanges

using (var db = new StuffEntities()){ 
    db.Things.Add(new Thing({...}); 
    //can I get the SQL insert statement at this point? 
    db.SaveChanges(); 
} 

私はそうのように実行前クエリ用に生成されたSQLを取得する方法に精通しています。INSERTはDbSetを返し、呼び出しのに対し>

var query = db.Thing.Where(x => x.ID == 9); 
Console.WriteLine(query.ToString()); 
//this prints the SQL select statement 

クエリはのIQueryable <を返します。 DbSetのToStringは標準オブジェクト名を出力するだけです。詳細は

答えて

13

別のオプション(私が正しくあなたの質問を理解していれば)、それらが実行される前に、一見あなたはSQLコマンドを検査することを可能にするIDbCommandInterceptor実装を使用することですが(私は私の言葉をヘッジ私はこれを自分で使っていないので)。このような

何か:

static StuffEntities() 
{ 
    Database.SetInitializer<StuffEntities>(null); // or however you have it 
    System.Data.Entity.Infrastructure.Interception.DbInterception.Add(new CommandInterceptor()); 
} 
+0

です。 interceptionContext.Resultを設定するだけで、データベースIOが停止します。ありがとう! –

+0

はDbInterceptorではないDbInterceptor – sam

5

使用インターセプタquery.ToString()私の知る限りのない等価ではありません。このlink

がファイル

<interceptors> 
    <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"> 
    <parameters> 
     <parameter value="C:\Temp\LogOutput.txt"/> 
    </parameters> 
    </interceptor> 
</interceptors> 
+0

実際のデータベース操作が実行された後、つまりSaveChangesを呼び出した後にのみログに記録されますか? –

+0

はいAFAIK詳細については、このリンクhttp://entityframework.codeplex.com/SourceControl/latest#src/EntityFramework/Infrastructure/Interception/DatabaseLogger.csを参照し、カスタムログの> IDbConfigurationInterceptorをオーバーライドしてください – rashfmnb

+0

私の質問は具体的ですそれが実行される前にSQLを見ることについて。 –

9

をを.configし、この中の追加を参照してください。あなたは最終的にDbContext.Database.Logプロパティを使用することができます。

db.Database.Log = s => 
{ 
    // You can put a breakpoint here and examine s with the TextVisualizer 
    // Note that only some of the s values are SQL statements 
    Debug.Print(s); 
}; 
db.SaveChanges(); 
13

常に便利なクエリを持つことがEF6で最も簡単な方法は、なし:

public class CommandInterceptor : IDbCommandInterceptor 
{ 
    public void NonQueryExecuting(
     DbCommand command, DbCommandInterceptionContext<int> interceptionContext) 
    { 
     // do whatever with command.CommandText 
    } 
} 

あなたのコンテキスト静的コンストラクタでEFで利用可能なDBInterceptionクラスを使用してそれを登録コードを変更することはDbContextにこれを追加し、デバッグ中にビジュアルスタジオの出力ウィンドウでクエリをチェックすることです。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    Database.Log = (query)=> Debug.Write(query); 
} 

EDIT

LINQPadもでのLINQをデバッグするには良い選択肢であり、また、SQLクエリを表示することができます。

+0

EF6は話せませんが、新しいEFコアでは動作しません。 – tnktnk

+0

参照:エンティティフレームワークのログと傍受データベース操作(EF6以降):https://msdn.microsoft.com/en-us/library/dn469464(v=vs.113).aspx – DeveloperDan

関連する問題