13

Entity Framework を SQL 通信に使用すると、奇妙なパターンの応答時間が発生します。

これは私のウェブホストからのものです:

ここに画像の説明を入力

これは私のローカルサーバーからのものです:

ここに画像の説明を入力

私が心配しているのは、応答時間の増加です。問題をコード Nop.Data > EfRepository.cs > public void Insert(T entity) > _entities.Add(entity); の 1 行に絞り込みました。はい、私はこれが NopCommerce に非常に特有であることを知っていますが、要点は、これをデバッグする方法について彼女に助けを求めているということです。

実行中の SQL を表示する、キャッチできるイベントはありますか? または、上記のコマンドでEntity Frameworkで実際に何が起こっているかをもっと知るために、他に何ができるでしょうか。

4

2 に答える 2

26

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 ステートメントをキャプチャできます (これが私の推奨するアプローチです)。

于 2011-10-26T11:22:49.880 に答える
14

EF6 では、dbcontext のコンストラクターでこれを行うこともできます。

public BookServiceContext() : base("name=BookServiceContext")
{
    // New code:
    this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
}

これにより、EF が生成するすべての SQL クエリがコンソールに記録されます。詳細については、この記事を参照してくださいhttp://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/

于 2015-04-24T14:02:36.887 に答える