SQLServer2008でEF4.3コードファーストを使用しています。CreateIfNotExistsを使用してデータベースを削除および再作成するいくつかのテストスイートを実行しています。これは問題なく動作しますが、犬は遅いです。最初の呼び出しでデータベースを作成するのに最大15秒かかる場合があり、その後は通常3〜6秒かかります。これが呼ばれる場所がいくつかあります。私はこれをできるだけ数回呼び出すようにすでに最適化しています。プログラムでデータベースの作成を高速化するためにできることはありますか?それが役立つ場合は、EFを回避してこれを実行するつもりですが、データベースをコードでビルドし続け、SQLスクリプトに戻らないようにしたいと思います。ありがとう!
1 に答える
これは問題なく動作しますが、犬は遅いです。
はい。重要なのは、実際のデータベースは、それほど頻繁に実行する必要のない統合テストにのみ使用することです。統合テストのセット全体は、通常、ビルドサーバーでのみ実行されます。
最初の呼び出しでデータベースを作成するのに最大15秒かかる場合があります
これは、単体テスト時にEFの初期化が遅いためです(x86への切り替えを試みることができます)。時間はビューの生成にも費やされます。ビューは事前生成できます。これは通常、実際のシステムの起動と初期化を減らすために行われますが、ビューの事前生成を使用して単体テストを高速化する場合は、テストからビルドに時間を移動するだけなので、あまり役に立ちません。
それが助けになるなら、私はこれを行うためにEFを回ることをいとわないが、データベースをコードで構築し続け、SQLに戻らないようにしたい
回避するということは、単純な古いSQLスクリプトを使用することを意味します。この操作に必要な追加の時間は、そのSQLの生成に費やされる可能性があります。通常のアプリケーション実行ではSQLは複数回必要ないため、SQLはキャッシュされないと思いますが、EFに、少なくともそのSQLの最も重要な部分を提供し、どこかにキャッシュして、必要なときに自分で実行するように依頼できます。 。EFは、テーブルと制約のSQLを提供できます。
var dbSql = ((IObjectContextAdapter) context).ObjectContext.CreateDatabaseScript();
データベースを作成して一緒に使用するには、独自の小さなSQLが必要です。次のスクリプトのようなものでも十分です。
CREATE DATABASE YourDatabaseName
USE YourDatabaseName
また、これを機能させ、プロセスを制御するには、最初にコードでデータベースの生成をオフにする必要があります。
Database.SetInitializer<YourContextType>(null);
データベース作成SQLを実行するときは、Master
データベースを指す個別の接続文字列が必要になります。