2012-06-22 42 views
11

最初にEFコードで作成された最初のクエリをスピードアップできるかどうかは疑問です。Entity Frameworkの起動時間

2つのフィールドを含む1つのエンティティで小さなテストプログラムを作成しました。最初のクエリは2.2秒、2番目のクエリは全く同じ0.006秒です。

私はすでにビューをプリコンパイルしていますので、ここで助けてください。 私は問題は、メモリ内でモデルを構築するのに時間がかかることですが、それは長くかかるでしょうか?そして、ビューがあるようにこのモデルをプリコンパイルする方法はありますか?

+1

私は間違っている可能性があります。この質問を見て、最初のクエリで何が起きているのかを理解してください。http://stackoverflow.com/questions/5634338/ef-4-1-code-first-onmodelcreating-call-time –

+0

@RaphaëlAlthausあなたは正しいかもしれません:/それはちょっと変ですDbModelBuilderクラスを使用して独自のモデルを構築し、そのオブジェクトのBuildメソッドを呼び出すことで、実行時ではなくコンパイル時にこれを実行できるはずです。ただし、実装されていない可能性があります。 – nyhjem

+0

データベーススキーマとの互換性を確認するのに時間がかかることがあります。これは、SQLプロファイラを使用して確認できます。 –

答えて

5

この記事:Squash Entity Framework startup time with pre-compiled viewsには、詳細な解決策が記載されています。

これは、プリコンパイルされ.Viewsクラスファイルを生成するために、Entity Frameworkのパワーツールで最適化エンティティデータモデルオプションを使用することを含みます。

+4

私はすでにそれを試みましたが、リンクした記事の手順に従っています。 ビューが生成されていますが、最初のアクセスはまだまだ遅いです。 私は少しテストをしました。最初に、ordenary SqlConnectionとSqlCommandを使用してデータベースにアクセスします。それは0.2秒かかります。ちょうどその後、私はEFを使用して同様のことを行います(con.Users.Count();)。これは3.08秒かかる..!その後、私は同じコード行をもう一度実行し、今からは0.007秒しかかかりません。 EFはデータベースに初めてアクセスしたときにビューを生成する以外に何かをしています。 – nyhjem

4

最初のクエリを実行すると、EFが初期化され、それには時間がかかります。私はEFのインフラストラクチャの初期化を高速化するために多くのことがあるとは思わないが、あなたが実際に探しているものがEFの初期化自体ではなく最初のクエリをスピードアップすることであれば、EFを強制的に初期化最初のクエリを実行しているより前の

 using (var db = new MyContext()) 
     { 
      db.Database.Initialize(force: true); 
     } 
+3

force = true will、すでにインフラストラクチャ/内部構造が既に初期化されていても強制的に再初期化するようにしてください。接続文字列やテーブル構造を変更しない限り、trueを使用しないでください。 –

関連する問題