3

私は Entity Framework 5 を POCO エンティティと遅延読み込みプロキシと共に使用しています。ほとんどの場合、後続の操作に必要なすべてのエンティティを熱心に読み込みますが、関連するエンティティを取得して移動するために遅延読み込みに依存する場合もあります。これはうまく機能しますが、アプリケーションを監査して、熱心な読み込みの最適化の機会を逃さないようにしたい (または、少なくとも遅延読み込みの過度の使用をなくしたい) ことを確認したいと思います。

私は現在、この目的で SQL プロファイラーに依存していますが、これは面倒です。熱心/明示的な読み込みと遅延読み込みのクエリを区別するのが難しいからです。

遅延読み込み操作をログに記録することは可能ですか? 基本的に、ストア クエリが実行されるたびに、遅延読み込みの結果として Debug.Print を実行したいと思います (ただし、クエリを明示的に実行した場合は除きます)。

遅延読み込みのメリット (またはその欠如) についてコメントしないでください。私は大規模なアプリケーションに取り組んでおり、この段階で切り替えることは非常に危険です。

4

2 に答える 2

1

このライブラリをチェックすることをお勧めします: https://github.com/jamesmanning/EntityFramework.LazyLoadLoggingInterceptor

具体的には、このファイルDbCommandInterceptorは、遅延読み込みクエリを検出できるEntity Framework の実装を示しています。コアには、ReaderExecutingこのハックを含むメソッドが実装されています。

        // unfortunately not a better way to detect whether the load is lazy or explicit via interceptor
        var stackFrames = new StackTrace(true).GetFrames();
        var stackMethods = stackFrames?.Select(x => x.GetMethod()).ToList();

        var dynamicProxyPropertyGetterMethod = stackMethods?
            .FirstOrDefault(x =>
                x.DeclaringType?.FullName.StartsWith("System.Data.Entity.DynamicProxies") == true &&
                x.Name.StartsWith("get_"));
        if (dynamicProxyPropertyGetterMethod == null)
        {
            // not in a lazy-load context, nothing to do
            return;
        }
于 2017-12-04T13:00:38.937 に答える
0

私はこのツールを使用します。https://code.google.com/p/mvc-mini-profiler/ Nuget から取得できます。MVC およびデスクトップ アプリケーションで使用できます (コマンド アプリケーションのミニ プロファイラーを検索してください)。SQL、実行時間、および呼び出されたコードを示します。無料。優れたツール。

どのクエリが遅延ロードされたかはわかりませんが、コードの特定の部分をターゲットにすることができるため、どのコードがどのクエリを呼び出しているかを確認できるはずです。

于 2013-04-27T19:33:05.940 に答える