web-dev-qa-db-ja.com

最初に本番データベースでエンティティフレームワークコードをデプロイする

最初にエンティティフレームワークコードを使用して、かなりシンプルなWebアプリを開発しました。数時間の不満の後で、localdbはSQL Server Expressですが、実際には、 'publish'(発行ウィザード)を使用する場合、本番環境での使用は意図されていないことに気付きました。参考までに、EF 6.1.3、SQL Server 2014、VS 2013、およびIIS 7.を使用しています。

私が正しく理解している場合、[localdbで公開]をクリックすると、localdbデータベースをIIS 7サーバーにコピーするだけです。更新したときにそれがなぜなのか理解できませんでした。実稼働サーバーデータベースが更新されていなかったというVS移行を介したlodaldbデータベースこれは、実際には2つの異なるlocaldbインスタンスであり、したがって同じデータではないことを理解しています(今は信じています)。

何でもいい-localdbはこれで完了し、自分のマシンに実際のSQL Server 2014 dbを作成した。私は何時間もグーグルググしていて、今何をすべきかわからない。いくつか質問があります。

  1. EFを使用してこの新しいデータベースを管理するにはどうすればよいですか?たとえば、新しい列を追加するとします。最初にそれをlocaldbに追加し、いくつかのテストを行ってから、Add-Migration blah、次にUpdate-Databaseを使用して移行を行います。次に、VSを使用してSQLスクリプトを生成し、それを本番DBサーバーで手動で実行する必要がありますか?

  2. これは素晴らしいことではないことはわかっていますが、エンティティフレームワークでローカルDBを使用する代わりに、EFを実際のステージングSQL Serverデータベース(テストデータベース)に接続して、このlocaldb bull ****をすべてスキップできますか?次に、コードファーストの移行を使用してそれを管理し、すべてを同期させることができますか?

  3. イニシャライザを使用するはずですか?これらを本番データベースに使用するかどうかについての矛盾するレポートを読んだ(このような)

    パブリッククラスPricedNotesInitializer:MigrateDatabaseToLatestVersion <...、...> {}

このことについて私が知る唯一の方法は、他の人からのブログ投稿を介してイライラすることです。ドキュメンテーションがなぜそんなにごみであるのか理解できません。

あなたの助けに感謝し、暴言を申し訳ありません。

10
coolboyjules

ローカルでSQL expressエディションを使用している場合は、SQL運用サーバーに簡単に移行できます。SQL運用サーバーは、SQL Azureまたは独自の運用サーバーにすることができます。

A 1。local connection stringproductionに変更し、package managerで以下のコマンドを実行するだけです。次に、更新されていないすべての移行スクリプトが本番環境で実行されます。

PM> Update-Database

A 2:この方法はお勧めしません。

A 3:これは次のように実行できます。

 Database.SetInitializer(new CreateDatabaseIfNotExists<YourDbContext>());
1
Sampath

初期化子を使用する

MigrateDatabaseToLatestVersion イニシャライザを使用すると、データベースへのスキーマの変更が(可能な場合はデータ損失なしで)デプロイ後にアプリケーションが最初に起動したときに自動的に行われます。

データの損失が発生した場合、エラーが発生し、適切なアクションを実行する必要があります。これをオーバーライドして、データが失われた場合でも処理を続行できます。

開発環境設定経験

他の回答がすでに指摘したように、LocalDBは開発に適しているため、環境ごとに1つの接続文字列が必要です。開発が必要な新しい開発者のために自動的に作成および初期化(およびテストデータをシード)できるので、それを奨励します。または、アプリケーションをソースからビルドして実行するだけでデバッグできます。

"新しい開発環境のセットアップ"エクスペリエンスは、ソリューションの読み込み、コードベースの構築および実行を除いて、手動ステップが少なく、できればゼロで、可能な限りスムーズである必要があります。

リリースサイクルを自動化する

デプロイとリリースのパイプラインは自動である必要があり、誤って実行されたり、忘れられたり、さらに悪化したりする可能性のある手動のコマンドを必要としません。

手動のステップとなる可能性があるのは、注意深く、またはいくつかのコンプライアンス要件を満たしたい場合、段階的な変更に対する単純なyes/no承認です。

ただし、ステージング環境での自動テストはこれを軽減し、成功すると自動的に本番環境にデプロイされます-完璧な世界で;)

本番環境に対してupdate-databaseを手動で実行するには、実行中のすべてのマシンが本番データベースにアクセスできる必要があります。対話的に実行している場合は、あり得ないシナリオまたは推奨されないシナリオです。必要に応じて、初期化子を使用するよりも制御を強化したい場合は、自動デプロイパイプラインの一部として script it を使用できます。これは、より単純なプロジェクトに最適です(ただし、これはそうであるようです)。

5
Oskar Duveborn

2つの接続文字列が必要です。1つはlocaldb用で、もう1つは運用SQLサーバー用です。

たとえば、localdbにadd-migrationおよびupdate-databaseを使用して、通常どおりに開発する必要があります。

次に、公開する準備ができたら、接続文字列をライブ文字列に変更する必要があります。サイトを公開します。次に、update-databaseコマンドを実行します。これにより、ライブデータベースが先ほど公開したものと同期されます。

2
Wurd

助けてくれてありがとう。君たちの助けを借りてそれを理解した。手順に興味がある人のために、ここにあります。ここにいくつかの追加のヘルプをリストしますが、上記の答えは本当に質問に答えます。これは私の質問の設定を前提としています。データベースをセットアップしたら、次のようにローカルデータベースで更新することをお勧めします。

  1. VS2013で、ツール-> SQLサーバーオブジェクトエクスプローラー->(LocalDb)\ v11.0->データベース-> [database_name]->右クリック->データ比較->スキーマ比較に移動します。
  2. 右側のドロップダウンでSQLデータベースを見つけ、接続をテストして機能することを確認します。

  3. [比較]-> [ターゲットの更新]をクリックします(これは本番データベースにはお勧めしませんが、作成したステージングデータベースの場合は問題ありません)。

  4. SSMS(SQL Server Management Studio)を実行すると、新しいテーブルと、スキーマ比較ツールが作成したものがすべて表示されます。すごい!

  5. イニシャライザを使用する場合は、先に進んで、CreateDatabaseIfNotExistsまたはデータベースを削除しないものに設定されていることを確認してください。つまり、好きなように使用できると思いますが、上記の手順の目的に反することになります。

  6. Webプロジェクトを右クリックし、[公開]をクリックして、Web配置を使用し、データベースに移動して、新しいデータベースをターゲットに設定しますコードの最初の移行を実行がオンになっていることを確認します(これにより、実行したすべての移行が実行されます新しいデータベースのlocaldb)。実際にこれを行う必要はありません。あるいは、これをオフのままにして、受け入れられた回答でSampathが推奨することを実行することもできます。

  7. できた!これで、実際のSQL Server Express DBに正常に変換されました。

データベースを管理するには、上記の答えに従ってください。または、発行ウィザードを再度使用して、コードの最初の移行を実行がオンになっていることを確認して発行します。

2
coolboyjules