2017-03-09 1 views
0

を実行していない-script、コンソールを管理し、私のSeed()方法が正常に実行され。しかし、私は-scriptパラメータを指定してコマンドを実行した場合:EFコードファーストアップデート - データベースが私のEntity Frameworkのコードファーストプロジェクトでシード()メソッド

update-database -script 

...シード()メソッドが呼び出されず、結果としてSQLデータベースをシードするためにSQLコマンドが含まれていません。この動作は繰り返し可能です。私は展開のための完全なDBスクリプトを作成しようとしています。

なぜ-scriptで、それなしで実行SQLコマンドの間に食い違いがあり、-scriptスイッチを使用する際にどのように私はSeed()方法を実行するためにupdate-databaseを得ることができますか?

答えて

1

私はこれが矛盾ではなく、設計上の特徴であると主張します。

-scriptを使用すると、データベースの更新が行われないため、Seed()メソッドも呼び出さないでください。また、マイグレーションは設計時ツールであり、実行時にコンパイルされて呼び出されるメソッドはSeed()です。

そしてSeed()方法の内容は、生成されたスクリプトに含まれていない理由のためとして、私の答えはまたランタイム設計時間の異なる概念です。あなたはこのようなSeed()方法があることを想像:

protected override void Seed(PersonContext context) 
{ 
    Random r = new Random(); 
    context.People.Add(new Person("PersonA", r.Next(90)); 
    context.SaveChanges(); 
} 

を今すぐRandomインスタンスが実行時に作成され、次の()は、実行時に呼び出されます。あなたはそれをSQLにコンパイルしようとしますか?ファイルがあり、そこからデータを読み込んでデータベースに入れるとどうなりますか?これらは設計時に評価することができないすべてのものです。実行時にのみ実行されます(つまり、設計時にファイルが適切な場所にない場合は、実行時にのみ問題ありません)。そのため、移行用スキャフォルダーのようなデザインタイムツールでは評価できません。

+0

しかし、データベースは通常、Enumのようなものを表現するためにかなり静的な「種」データを必要とします。私は、EmployeeType(1、 "Permanent")(2、 "Temporary")などのようなものを含まないOpsのDB展開スクリプトを生成するためにupdate-database -scriptを使用することはできません。 –

+1

はい、そうです。しかし、それは移行の範囲にはありません。このようなものが必要な場合は、自分で書き込む必要があります。私はまた、私のプロジェクトのほとんどでこのアプローチに従っています。 プロジェクトをどのように構築するか、これらのスクリプトを配置する場所が心配な場合は、SSDTを検討する必要があります。しかし、その場合でも、あなたはこれらのスクリプトを自分で書く必要があります。 –

+0

Configuration.csでこれを行うのは本当に便利でしょうか?それはすでにソース管理にあり、移行では暗黙のうちにロックステップに入っています。私は可能な限りこれを自動化したいと思います。私は別のSOの質問をする必要があります:) –

関連する問題