8

私のコンテキストには ~300 の DbSet があり、アプリの読み込み後の最初のクエリ (インデックス付きフィールドの FirstOrDefault()) には ~40 秒かかります。

これを改善するために、ここで T4 テンプレートを使用して、EF 4.3.1 Code First で事前生成されたビューを使用しようとしています。

http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/

コンパイルしましたが、パフォーマンスの違いは見られません。私が経験している痛みを伴う遅い起動に役立つことを期待/想定していましたが、うまくいきませんでした。

それは助けるべきですか?そうでない場合、事前生成されたビューは正確に何に使用されますか? また、起動時間を改善するためにできることはありますか? コンテキストを分割することは、控えめに言っても苦痛です。

4

2 に答える 2

5

実際には、DbContext が存在するアセンブリではなく、最初に参照されたエンティティが存在するアセンブリで事前生成されたビューを検索しているように見えることがわかりました。詳細については、http: //blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/#comment-76を参照してください。

これを回避するために、新しいエンティティを作成してコンテキストのアセンブリに配置し、最初の DbSet としてリストしました。今ではそれを拾い上げ、うまく機能します (これはばかげていることを除いて)。

于 2012-08-21T18:34:43.030 に答える
5

NHibernate や EF などの特定の ORM は、単に起動が遅いだけです。この遅さを「修正」しようとするのではなく、アプリ プールが起動するたびに IIS がこのコードをトリガーするようにして、問題を解消したいと考えています。この問題を解決するには、アプリケーション プールを自動的に開始するように IIS を構成する必要があります。このソリューションは、.NET 4 および IIS7.5 以降でのみ使用できます。

web.config に serviceAutoStartProviders ノードを追加し、アプリケーションのアプリ プールに startMode="AlwaysRunning" を設定することで、IProcessHostPreloadClientをロードするクラスを実装し、それを使用するようにアプリケーションを構成します。ObjectContext

詳細については、Scott Gu のブログを参照してください。

于 2012-07-21T16:29:58.800 に答える