C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

本番環境にコードファーストで作成したDBの変更 /Saipon (20/11/10(Tue) 13:23) #96305
Re[1]: 本番環境にコードファーストで作成したDBの変更 /WebSurfer (20/11/10(Tue) 15:55) #96308
  └ Re[2]: 本番環境にコードファーストで作成したDBの変更 /Saipon (20/11/10(Tue) 17:18) #96309
    ├ Re[3]: 本番環境にコードファーストで作成したDBの変更 /Saipon (20/11/10(Tue) 18:44) #96312
    └ Re[3]: 本番環境にコードファーストで作成したDBの変更 /WebSurfer (20/11/10(Tue) 18:23) #96311
      └ Re[4]: 本番環境にコードファーストで作成したDBの変更 /Saipon (20/11/10(Tue) 18:58) #96313
        └ Re[5]: 本番環境にコードファーストで作成したDBの変更 /WebSurfer (20/11/10(Tue) 19:57) #96314
          └ Re[6]: 本番環境にコードファーストで作成したDBの変更 /Saipon (20/11/11(Wed) 12:01) #96319
            ├ Re[7]: 本番環境にコードファーストで作成したDBの変更 /魔界の仮面弁士 (20/11/11(Wed) 12:39) #96321
            │└ Re[8]: 本番環境にコードファーストで作成したDBの変更 /Saipon (20/11/11(Wed) 12:55) #96322
            └ Re[7]: 本番環境にコードファーストで作成したDBの変更 /WebSurfer (20/11/11(Wed) 13:13) #96323
              └ Re[8]: 本番環境にコードファーストで作成したDBの変更 /Saipon (20/11/11(Wed) 13:35) #96324 解決済み


親記事 / ▼[ 96308 ]
■96305 / 親階層)  本番環境にコードファーストで作成したDBの変更
□投稿者/ Saipon (1回)-(2020/11/10(Tue) 13:23:22)

分類:[.NET 全般] 

2020/11/10(Tue) 13:25:41 編集(投稿者)

お世話になります。

.NET Framework4.8のASP.NET MVC5(C#) EntityFramework6でWEBアプリを作成しています。
DBはSQLServer2017です。

WindowsServer2019上のIISにWEBサイトを設置しアクセスしたところ、コードファーストの為、SQLServerにもDBが作成されました。
ここまでは良いのですが、

例えばこの環境で実際に本番運用をした場合、DBへのフィールド追加や桁数変更等の修正はDBに手動で直接行うものなのでしょうか?
当然ソースのモデル(POCO?)を修正することになると思いますが、モデルを修正しWEB発行しサーバーにファイルしてサイトにアクセスすると、
DBが再作成されデータが消えてしまうようなのです。
それに対してデータの再投入をするのがベストプラクティスなのでしょうか?

例えばモデルが変わってもDBを再作成せずに、手動でDB変更して運用するのが普通な気がしています。


新規のWEBアプリなのでコードファーストで試していますが、現状、モデルの変更の都度データを再投入しており、
いまいちメリットを理解できておりません。(MsAccessなどでリンクするのも主キー名の変更が必要等、不便を感じております。)
コードファーストでの開発時、運用時のメリットや使い方など、まとまった記事やサイト等ありましたら、教えて頂けると助かります。

漠然とした質問ですみません。
宜しくお願い致します。
[ □ Tree ] 返信 編集キー/

▲[ 96305 ] / ▼[ 96309 ]
■96308 / 1階層)  Re[1]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ WebSurfer (2153回)-(2020/11/10(Tue) 15:55:46)
No96305 (Saipon さん) に返信

> WindowsServer2019上のIISにWEBサイトを設置しアクセスしたところ、コードファーストの為、
> SQLServerにもDBが作成されました。ここまでは良いのですが、

ホントにそれで良いのでしょうか?

そうだとすると IIS のワーカープロセスのアカウントに SQL Server のテーブルの Create と
か Drop などを行う権限を与えたということだと思いますが、それは権限の与えすぎでは?

> 例えばこの環境で実際に本番運用をした場合、DBへのフィールド追加や桁数変更等の修正は
> DBに手動で直接行うものなのでしょうか?

本番環境での DB の変更・修正はないというのが前提だと自分は思うのですが?

そもそも EF Code First は、開発時に、本番環境で変更は必要ない状態まで作り上げるために、
何度もの DB の変更・修正が DB に手を加えなくてもコードの変更・修正で可能にするための
開発用の機能という位置づけのはずなのですが・・・

> 当然ソースのモデル(POCO?)を修正することになると思いますが、モデルを修正しWEB発行
> しサーバーにファイルしてサイトにアクセスすると、DBが再作成されデータが消えてしまう
> ようなのです。それに対してデータの再投入をするのがベストプラクティスなのでしょうか?
> 例えばモデルが変わってもDBを再作成せずに、手動でDB変更して運用するのが普通な気がし
> ています。

上にも書きましたが、それは開発時に限る話で、運用環境でそういうことはないところまで EF
Code First の機能を利用して作り上げるという話になると思います。

とは言え、運用状況で変更が絶対ないということもないでしょうから、そうなったら「手動でDB
変更」というのが選択肢になると思いますが。

> 新規のWEBアプリなのでコードファーストで試していますが、現状、モデルの変更の都度データ
> を再投入しており、いまいちメリットを理解できておりません。

データベースを自動的に削除して再作成するように設定してませんか? それを避けるために
Migration 機能というのがありますが。使ってますか?

そのあたりをご存じなければ、以下のチュートリアルの最初から「Code First Migrations と展開」
のところまでやってみてはいかがですか。

MVC 5 を使用する Entity Framework 6 Code First の概要
https://docs.microsoft.com/ja-jp/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/
[ 親 96305 / □ Tree ] 返信 編集キー/

▲[ 96308 ] / ▼[ 96312 ] ▼[ 96311 ]
■96309 / 2階層)  Re[2]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ Saipon (2回)-(2020/11/10(Tue) 17:18:41)
No96308 (WebSurfer さん) に返信

> そうだとすると IIS のワーカープロセスのアカウントに SQL Server のテーブルの Create と
> か Drop などを行う権限を与えたということだと思いますが、それは権限の与えすぎでは?

確かにSQLServerに対する適切な権限の付与が出来ていませんでした。
こちらは別途検討します。


> 本番環境での DB の変更・修正はないというのが前提だと自分は思うのですが?

これも仰る通りですが、お恥ずかしながら今までにDBの変更・修正が無いシステムを経験したことがなく、
今回は特に、使いながらより良いアプリにして行こう、ということのようで
ほぼ確実に変更がありそうです。


> そもそも EF Code First は、開発時に、本番環境で変更は必要ない状態まで作り上げるために、
> 何度もの DB の変更・修正が DB に手を加えなくてもコードの変更・修正で可能にするための
> 開発用の機能という位置づけのはずなのですが・・・

開発用という位置づけなのですね。開発時の設定記事などは見つかるのですが、
本番での設定例が記載されている記事や書籍が見つけられず、漠然とDB再作成を止めて、DBを手動変更するものと考えてました。


> データベースを自動的に削除して再作成するように設定してませんか? それを避けるために

もしかすると「Database.SetInitializer」のクラスでしょうか?
確かにSystem.Data.Entity.DropCreateDatabaseIfModelChangesを継承してSeedメソッドでテストデータを入れていました。
が、CreateDatabaseIfNotExistsに変更しても再作成が無くなるだけで、モデルが変更されました、とエラーになり、
結局、DBの再作成を自動でやるか手動でやるかの違いと認識してしまってました。


> Migration 機能というのがありますが。使ってますか?

Migration機能についてはアプリを作り始める際に試しており、エラーで動かなかったのですが、
チュートリアルを見直して再度試してみます。

ちなみにMigration機能の概要として、チュートリアルには、
「このメソッドは、実稼働環境にアプリケーションを展開するまで、データベースとデータ モデルの同期の維持がうまく機能します。 アプリケーションが運用環境で実行されている場合、通常は保持するデータを格納し、新しい列の追加などの変更を行うたびにすべてのデータを失わないようにします。」
とありますが、本番環境でも使えるものと考えて良いのでしょうか。
もしくはその辺りの段取りが分かる記事や書籍などご存知だったりしますでしょうか。

[ 親 96305 / □ Tree ] 返信 編集キー/

▲[ 96309 ] / 返信無し
■96312 / 3階層)  Re[3]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ Saipon (3回)-(2020/11/10(Tue) 18:44:30)
改めてMigration機能を試してみたところ、あっけないほどエラー無く動きました。
モデルの変更が同期されて、データも残り、履歴も残る。ものすごく便利ですね。

が、やはり本番環境への移行のイメージが沸きません。

VisualStudio2019のプロジェクト右クリックの「発行」から公開方法を「ファイルシステム」にしているのですが、
それをサイトのフォルダにアップしてアクセスするとDBが作成されるという流れは一般的では無いのでしょうか?
(先にご指摘受けたワーカープロセスの権限問題はありますが。)

DBの変更についても、やはり手動が最有力でしょうか。
そもそもAdd-MigrationやUpdate-Databaseを本番サーバー上で流す方法もまだ分からない状態ではありますが。。


[ 親 96305 / □ Tree ] 返信 編集キー/

▲[ 96309 ] / ▼[ 96313 ]
■96311 / 3階層)  Re[3]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ WebSurfer (2154回)-(2020/11/10(Tue) 18:23:13)
No96309 (Saipon さん) に返信

> CreateDatabaseIfNotExistsに変更しても再作成が無くなるだけで、モデルが変更されました、
> とエラーになり、結局、DBの再作成を自動でやるか手動でやるかの違いと認識してしまってました。

なぜそうなったのかきちんと確認してないですよね。エラーの原因は、何か変更した結果、 DB
とコードの整合が取れなくなったからではないのですか? であれば、当たり前の結果のように
思いますけど。

> ちなみにMigration機能の概要として、チュートリアルには、
> 「このメソッドは、実稼働環境にアプリケーションを展開するまで、データベースとデータ
> モデルの同期の維持がうまく機能します。 アプリケーションが運用環境で実行されている場合、
> 通常は保持するデータを格納し、新しい列の追加などの変更を行うたびにすべてのデータを失わないようにします。」
> とありますが、本番環境でも使えるものと考えて良いのでしょうか。

どうしてそう解釈できるのか分かりませんが、とりあえず解釈の仕方は置いといて・・・

良くないと思います。

運用中の SQL Server に EF Code First の Migration で変更をかけるなんてとんでもない
と思います。

そもそも、IIS のワーカープロセスに権限がないのでできないのでは? その時だけそのため
に SQL Server の sa 権限を与えるとかは非現実的では?

質問者さんと質問者さんの属する組織が 100% 責任を持つと言われても、もし自分が客なら
絶対に許可しないと思います。

でも、まぁ、自分には止める権利はないのでご勝手に。

[ 親 96305 / □ Tree ] 返信 編集キー/

▲[ 96311 ] / ▼[ 96314 ]
■96313 / 4階層)  Re[4]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ Saipon (4回)-(2020/11/10(Tue) 18:58:55)
No96311 (WebSurfer さん) に返信

入れ違いで投稿してしまいました。

> なぜそうなったのかきちんと確認してないですよね。エラーの原因は、何か変更した結果、 DB
> とコードの整合が取れなくなったからではないのですか? であれば、当たり前の結果のように
> 思いますけど。

はい。エラーの原因が突き止められなかったので一旦諦めてしまいました。


> どうしてそう解釈できるのか分かりませんが、とりあえず解釈の仕方は置いといて・・・

解釈につきましては、
>>モデルの同期の維持がうまく機能します。 アプリケーションが運用環境で実行されている場合、
>>通常は保持するデータを格納し、新しい列の追加などの変更を行うたびにすべてのデータを失わないようにします。」

このチュートリアルの一文で「運用環境で実行されている場合」とあった為、
本番でも何かしらの方法でMigration機能を使うことを意味しているのかと思いました。
結局、Migrationは開発用、ということが理解できていなかった為と思います。


> 良くないと思います。
>
> 運用中の SQL Server に EF Code First の Migration で変更をかけるなんてとんでもない
> と思います。

私も本番にUpdate-Databaseをするのは、方法があったとしてもさすがに気が引けておりました。
となると、結局、コードファースト関係なく、開発環境でDB作成のスクリプトを作成し、
本番環境で構築する、というのが普通なのでしょうか。

この辺りが情報が見つけられず、周りにエンジニアもいない為、分からなかった点です。
[ 親 96305 / □ Tree ] 返信 編集キー/

▲[ 96313 ] / ▼[ 96319 ]
■96314 / 5階層)  Re[5]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ WebSurfer (2155回)-(2020/11/10(Tue) 19:57:09)
No96313 (Saipon さん) に返信

> となると、結局、コードファースト関係なく、開発環境でDB作成のスクリプトを作成し、
> 本番環境で構築する、というのが普通なのでしょうか。

普通かどうかは質問者さんの環境によるはずなので分かりませんが、EF Code First を利用
する前はそうしていたということであれば、同じようにすれば良いと思いますけど。
[ 親 96305 / □ Tree ] 返信 編集キー/

▲[ 96314 ] / ▼[ 96321 ] ▼[ 96323 ]
■96319 / 6階層)  Re[6]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ Saipon (5回)-(2020/11/11(Wed) 12:01:16)
No96314 (WebSurfer さん) に返信

> 普通かどうかは質問者さんの環境によるはずなので分かりませんが、EF Code First を利用
> する前はそうしていたということであれば、同じようにすれば良いと思いますけど。

“普通”という言い方が悪かったです。すみません。
世の中、どんな環境があるのか(オンプレやAzureとかそういう違いのことですかね)、
それに対しエンジニアがどのようにしているかが分からないので、
「こんな環境の場合、こんなやり方をしているよ。」という一例が知りたかったのです。

自分はEF Code Firstを利用する前は、オンプレばかりでスクリプトを使ってましたが、
今回、EF Code Firstでファイルシステムでのデプロイを利用し初回サイトアクセス時にDBが作成されたのですが、
WebSurferさんは、EF Code Firstを使用した場合、どんな環境が多くて、その場合にどのようにDBを作成しているのでしょう。。

先のチュートリアルのサイトでは、AzureのApp Serviceにデプロイする流れの中で、
「「Code First Migrations の実行 (アプリの起動時に実行)」を設定することで、web.configにMigration用の接続文字が追加される」
とありますので、その辺りがヒントかと思ってますが、これをファイル発行ではどのようにするかが分かりませんでした。

引き続き調査をしていて、以下のようなサイトを見つけたので、現在確認中です。
https://github.com/dotnet/AspNetDocs.ja-jp/blob/live/aspnet/web-forms/overview/deployment/visual-studio-web-deployment/deploying-to-iis.md



[ 親 96305 / □ Tree ] 返信 編集キー/

▲[ 96319 ] / ▼[ 96322 ]
■96321 / 7階層)  Re[7]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ 魔界の仮面弁士 (2907回)-(2020/11/11(Wed) 12:39:11)
No96319 (Saipon さん) に返信
> 引き続き調査をしていて、以下のようなサイトを見つけたので、現在確認中です。
> https://github.com/dotnet/AspNetDocs.ja-jp/blob/live/aspnet/web-forms/overview/deployment/visual-studio-web-deployment/deploying-to-iis.md

上記の公開サイトはこちら。
https://docs.microsoft.com/ja-jp/aspnet/web-forms/overview/deployment/visual-studio-web-deployment/deploying-to-iis
[ 親 96305 / □ Tree ] 返信 編集キー/

▲[ 96321 ] / 返信無し
■96322 / 8階層)  Re[8]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ Saipon (6回)-(2020/11/11(Wed) 12:55:23)
No96321 (魔界の仮面弁士 さん) に返信

> 上記の公開サイトはこちら。
> https://docs.microsoft.com/ja-jp/aspnet/web-forms/overview/deployment/visual-studio-web-deployment/deploying-to-iis

ありがとうございます!
画像が無くて困っておりました!
[ 親 96305 / □ Tree ] 返信 編集キー/

▲[ 96319 ] / ▼[ 96324 ]
■96323 / 7階層)  Re[7]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ WebSurfer (2156回)-(2020/11/11(Wed) 13:13:54)
No96319 (Saipon さん) に返信

表題の「本番環境にコードファーストで作成したDBの変更」から、開発環境に作った SQL Server
の DB を最初に運用サーバーにデプロイするときにどうするかという話に変わってきているよう
な気がしますが・・・

そういう話ですと、自分はお役に立てないです。他の方の回答をお待ちください。

[ 親 96305 / □ Tree ] 返信 編集キー/

▲[ 96323 ] / 返信無し
■96324 / 8階層)  Re[8]: 本番環境にコードファーストで作成したDBの変更
□投稿者/ Saipon (7回)-(2020/11/11(Wed) 13:35:33)
No96323 (WebSurfer さん) に返信
> ■No96319 (Saipon さん) に返信
>
> 表題の「本番環境にコードファーストで作成したDBの変更」から、開発環境に作った SQL Server
> の DB を最初に運用サーバーにデプロイするときにどうするかという話に変わってきているよう
> な気がしますが・・・
>
> そういう話ですと、自分はお役に立てないです。他の方の回答をお待ちください。
>

確かに表題の質問ですと「手動でDB変更」という回答を頂いてましたね。
ありがとうございました。
話が変わってしまったので、この質問はクローズします。

しかし、本番サーバーに関する書籍や記事、見つからないものですねぇ。(探し方の問題かもしれませんが。。)
皆さんどうされてるんでしょうねぇ。

解決済み
[ 親 96305 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -