私はEF5を使用しており、組み込みのデータベース初期化子がSeed()メソッドをどのように呼び出しているかを把握しようとしています。これらは私の質問です:
1.モデルが変更された場合にのみデータベースをシードするための適切な初期化子は何ですか?
2. web.configで各db初期化子を構成するにはどうすればよいですか?
私の最初の質問の明確化:
これまでのところ、これらはEF5の組み込みデータベース初期化子であることがわかっています。
- MigrateDatabaseToLatestVersion
- CreateDatabaseIfNotExists
- DropCreateDatabaseIfModelChanges
- DropCreateDatabaseAlways
私の問題は、これらの各初期化子のSeedメソッドがいつ呼び出されるかを理解することです。EntityFramework dllの内部を調べ、これらのイニシャライザーのInitializeDatabase()メソッドのそれぞれのコードをチェックして、それぞれがいつ呼び出されるかをチェックしました。これは私が見つけたものです:
MigrateDatabaseToLatestVersion:シードメソッドがいつ呼び出されるかはわかりませんでしたが、テストからは、モデルに変更があるかどうかに関係なく、アプリが実行されるたびに呼び出されます。
CreateDatabaseIfNotExists:Seedメソッドは、データベースの作成時にのみ呼び出されることがわかりました。存在する場合は、シードを実行しないでください。
DropCreateDatabaseIfModelChanges:モデルが変更されたかどうかに関係なく、InitializeDatabaseメソッドは毎回Seed()を呼び出すようです。呼び出しはif(context.Dabase.Exists())チェックの外にあります。
DropCreateDatabaseAlways:これが常にSeedメソッドを呼び出すことは明らかです。
これは正しいです?もしそうなら、モデルが変更された場合にシードを制限することはできないようであり、おそらくカスタム初期化子を作成する必要があります。
2番目の質問に関しては、MigrateDatabaseToLatestVersionの構成方法を知っていますが、この宣言の意味がわからないため、書くのが難しいと思います(特に、 '2の部分-列挙型の値です。この場合、どのようにすべきですか?他の初期化子の対応する数はわかりますか?):
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>
<contexts>
<context type="Digidata.MP.Data.ObjectContext, Digidata.MP.Data">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Digidata.MP.Data.ObjectContext, Digidata.MP.Data], [Digidata.MP.Data.Migrations.Configuration, Digidata.MP.Data]], EntityFramework"/>
</context>
</contexts>
設定ファイルで組み込みの初期化子を宣言する方法の説明はどこにありますか?