Visual Studio を使用した web 配置の ASP.NET: データベース配置の準備

スタート プロジェクトのダウンロード

このチュートリアル シリーズでは、Visual Studio 2012 または Visual Studio 2010 を使用して、ASP.NET Web アプリケーションをAzure App Service Web Appsまたはサード パーティのホスティング プロバイダーに展開 (発行) する方法について説明します。 シリーズの詳細については、シリーズ の最初のチュートリアルを参照してください。

概要

このチュートリアルでは、プロジェクトをデータベース配置の準備をする方法について説明します。 アプリケーションの 2 つのデータベース内のデータベース構造とデータの一部 (すべてではない) を、テスト、ステージング、および運用環境にデプロイする必要があります。

通常、アプリケーションを開発するときに、ライブ サイトに展開しないデータベースにテスト データを入力します。 ただし、デプロイする運用データがある場合もあります。 このチュートリアルでは、Contoso University プロジェクトを構成し、デプロイ時に正しいデータが含まれるように SQL スクリプトを準備します。

リマインダー: チュートリアルを進める際にエラー メッセージが表示されたり、何かが機能しない場合は、必ずトラブルシューティング ページをチェックしてください。

SQL Server Express LocalDB

サンプル アプリケーションでは、SQL Server Express LocalDB を使用します。 SQL Server Expressは、SQL Serverの無料版です。 これは、SQL Serverの完全なバージョンと同じデータベース エンジンに基づいているため、開発中に一般的に使用されます。 SQL Server Expressを使用してテストし、運用環境でアプリケーションが同じように動作することを確認できます。ただし、SQL Serverエディションによって異なる機能の例外がいくつかあります。

LocalDB は、データベースを .mdf ファイルとして操作できるSQL Server Expressの特別な実行モードです。 通常、LocalDB データベース ファイルは Web プロジェクトの App_Data フォルダーに保持されます。 SQL Server Expressのユーザー インスタンス機能では、.mdf ファイルを操作することもできますが、ユーザー インスタンス機能は非推奨です。そのため、.mdf ファイルの操作には LocalDB をお勧めします。

通常、SQL Server Expressは運用 Web アプリケーションには使用されません。 特に LocalDB は、IIS で動作するように設計されていないため、Web アプリケーションでの運用環境での使用にはお勧めしません。

Visual Studio 2012 では、LocalDB は Visual Studio と共に既定でインストールされます。 Visual Studio 2010 以前のバージョンでは、SQL Server Express (LocalDB なし) は既定で Visual Studio にインストールされます。そのため、このシリーズの最初のチュートリアルの前提条件の 1 つとしてインストールしました。

LocalDB を含むSQL Serverエディションの詳細については、次のリソース「SQL Server データベースの操作」を参照してください。

Entity Framework とユニバーサル プロバイダー

データベース アクセスの場合、Contoso University アプリケーションでは、アプリケーションが.NET Frameworkに含まれていないため、アプリケーションと共に展開する必要がある次のソフトウェアが必要です。

このソフトウェアは NuGet パッケージに含まれているため、プロジェクトは既に設定されているため、必要なアセンブリがプロジェクトと共に展開されます。 (リンクは、これらのパッケージの現在のバージョンを指しています。これは、このチュートリアルでダウンロードしたスターター プロジェクトにインストールされているバージョンよりも新しい可能性があります)。

Azure ではなくサードパーティのホスティング プロバイダーにデプロイする場合は、Entity Framework 5.0 以降を使用していることを確認してください。 以前のバージョンのCode First Migrationsでは完全信頼が必要であり、ほとんどのホスティング プロバイダーはアプリケーションを Medium Trust で実行します。 中程度の信頼の詳細については、「 テスト環境として IIS に展開する 」チュートリアルを参照してください。

アプリケーション データベースのデプロイ用にCode First Migrationsを構成する

Contoso University アプリケーション データベースは Code First によって管理され、Code First Migrationsを使用してデプロイします。 Code First Migrationsを使用したデータベースデプロイの概要については、このシリーズの最初のチュートリアルを参照してください。

アプリケーション データベースをデプロイする場合、通常は、すべてのデータを含む開発データベースを運用環境にデプロイするだけではありません。これは、その中のデータの多くがテスト目的でのみ存在する可能性があるためです。 たとえば、テスト データベース内の学生名は架空のものです。 一方、多くの場合、データをまったく含まないデータベース構造だけをデプロイすることはできません。 テスト データベース内のデータの一部は実際のデータであり、ユーザーがアプリケーションの使用を開始するときにそこに存在する必要があります。 たとえば、データベースに、有効な成績値または実際の部署名を含むテーブルがあるとします。

この一般的なシナリオをシミュレートするには、運用環境に存在するデータのみをデータベースに挿入するCode First MigrationsSeedメソッドを構成します。 Code First が運用環境でデータベースを作成した後に運用環境で実行されるため、この Seed メソッドはテスト データを挿入しないでください。

移行がリリースされる前の以前のバージョンの Code First では、開発中のすべてのモデル変更でデータベースを完全に削除して最初から再作成する必要があるため、メソッドでテスト データを挿入するのが一般的 Seed でした。 Code First Migrationsでは、データベースの変更後もテスト データが保持されるため、メソッドにテスト データをSeed含める必要はありません。 ダウンロードしたプロジェクトでは、初期化子クラスの メソッドにすべてのデータを Seed 含む メソッドを使用します。 このチュートリアルでは、その初期化子クラスを無効にし、移行を有効にします。 次に、Migrations 構成クラスの メソッドを更新 Seed して、運用環境に挿入するデータのみを挿入します。

次の図は、アプリケーション データベースのスキーマを示しています。

School_database_diagram

これらのチュートリアルでは、サイトを最初に展開するときに、 テーブルと Enrollment テーブルを空にする必要があると想定Studentします。 他のテーブルには、アプリケーションの稼働時に事前に読み込む必要があるデータが含まれています。

初期化子を無効にする

Code First Migrationsを使用するため、Code First 初期化子を使用するDropCreateDatabaseIfModelChanges必要はありません。 この初期化子のコードは、ContosoUniversity.DAL プロジェクトの SchoolInitializer.cs ファイルにあります。 Web.config ファイルの 要素の appSettings 設定により、アプリケーションがデータベースに初めてアクセスしようとするたびに、この初期化子が実行されます。

<appSettings>
  <add key="Environment" value="Dev" />
  <add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" value="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" />
</appSettings>

アプリケーション Web.config ファイルを開き、Code First 初期化子クラスを add 指定する要素を削除またはコメントアウトします。 要素は appSettings 次のようになります。

<appSettings>
  <add key="Environment" value="Dev" />
</appSettings>

Note

初期化子クラスを指定するもう 1 つの方法は、Global.asax ファイルの メソッドで をApplication_Start呼び出Database.SetInitializerすことです。 そのメソッドを使用して初期化子を指定するプロジェクトで Migrations を有効にする場合は、そのコード行を削除します。

注意

Visual Studio 2013を使用している場合は、手順 2 から 3 の間に次の手順を追加します。(a) PMC で「update-package entityframework -version 6.1.1」と入力して、EF の現在のバージョンを取得します。 (b) プロジェクトをビルドしてビルド エラーの一覧を取得し、修正します。 存在しなくなった名前空間の using ステートメントを削除し、右クリックして [解決] をクリックして必要な using ステートメントを追加し、System.Data.EntityState の出現箇所を System.Data.Entity.EntityState に変更します。

Code First Migrations の有効化

  1. ContosoUniversity プロジェクト (ContosoUniversity.DAL ではなく) がスタートアップ プロジェクトとして設定されていることを確認します。 ソリューション エクスプローラーで、ContosoUniversity プロジェクトを右クリックし、[スタートアップ プロジェクトとして設定] を選択します。 Code First Migrationsスタートアップ プロジェクトを調べると、データベース接続文字列が検索されます。

  2. [ツール] メニューの [NuGet パッケージ マネージャー パッケージ マネージャー> コンソール] を選択します

    Selecting_Package_Manager_Console

  3. [パッケージ マネージャー コンソール] ウィンドウの上部で、既定のプロジェクトとして [ContosoUniversity.DAL] を選択し、プロンプトでPM>「enable-migrations」と入力します。

    enable-migrations コマンド

    ( enable-migrations コマンドが認識されないというエラーが発生した場合は、 コマンド update-package EntityFramework -Reinstall を入力して、もう一度やり直してください)。

    このコマンドは、ContosoUniversity.DAL プロジェクトに Migrations フォルダーを作成し、そのフォルダーに、移行の構成に使用できる Configuration.cs ファイルと、データベースを作成する最初の移行用 の InitialCreate.cs ファイルの 2 つのファイルを格納します。

    移行フォルダー

    コマンドは Code First コンテキスト クラスを含むプロジェクトで実行する必要があるためenable-migrationsパッケージ マネージャー コンソール既定のプロジェクト ドロップダウン リストで DAL プロジェクトを選択しました。 そのクラスがクラス ライブラリ プロジェクト内にある場合、Code First Migrationsは、ソリューションのスタートアップ プロジェクトでデータベース接続文字列を検索します。 ContosoUniversity ソリューションでは、Web プロジェクトがスタートアップ プロジェクトとして設定されています。 接続文字列を持つプロジェクトを Visual Studio のスタートアップ プロジェクトとして指定しない場合は、PowerShell コマンドでスタートアップ プロジェクトを指定できます。 コマンド構文を表示するには、コマンド を入力します get-help enable-migrations

    データベースが enable-migrations 既に存在するため、コマンドによって最初の移行が自動的に作成されます。 別の方法として、Migrations にデータベースを作成してもらう方法があります。 これを行うには、移行を有効にする前に、サーバー エクスプローラーまたはSQL Server オブジェクト エクスプローラーを使用して ContosoUniversity データベースを削除します。 移行を有効にした後、"add-migration InitialCreate" コマンドを入力して、最初の移行を手動で作成します。 その後、"update-database" コマンドを入力してデータベースを作成できます。

Seed メソッドを設定する

このチュートリアルでは、Code First Migrations Configuration クラスの メソッドにコードをSeed追加して、固定データを追加します。 Code First Migrationsは、移行のたびに メソッドをSeed呼び出します。

メソッドは Seed 移行のたびに実行されるため、最初の移行後にテーブルにデータが既に存在します。 この状況を処理するには、 メソッドを AddOrUpdate 使用して、既に挿入されている行を更新するか、まだ存在しない場合は挿入します。 この方法は AddOrUpdate 、シナリオに最適な選択肢ではない可能性があります。 詳細については、Julie Lerman のブログの 「EF 4.3 AddOrUpdate メソッドに注意 する」を参照してください。

  1. Configuration.cs ファイルを開き、 メソッドのコメントをSeed次のコードに置き換えます。

    var instructors = new List<Instructor>
    {   
        new Instructor { FirstMidName = "Kim",     LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), OfficeAssignment = new OfficeAssignment { Location = "Smith 17" } },
        new Instructor { FirstMidName = "Fadi",    LastName = "Fakhouri",    HireDate = DateTime.Parse("2002-07-06"), OfficeAssignment = new OfficeAssignment { Location = "Gowan 27" } },
        new Instructor { FirstMidName = "Roger",   LastName = "Harui",       HireDate = DateTime.Parse("1998-07-01"), OfficeAssignment = new OfficeAssignment { Location = "Thompson 304" } },
        new Instructor { FirstMidName = "Candace", LastName = "Kapoor",      HireDate = DateTime.Parse("2001-01-15") },
        new Instructor { FirstMidName = "Roger",   LastName = "Zheng",       HireDate = DateTime.Parse("2004-02-12") }
    };
    instructors.ForEach(s => context.Instructors.AddOrUpdate(i => i.LastName, s));
    context.SaveChanges();
    
    var departments = new List<Department>
    {
        new Department { Name = "English",     Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 1 },
        new Department { Name = "Mathematics", Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 2 },
        new Department { Name = "Engineering", Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 3 },
        new Department { Name = "Economics",   Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 4 }
    };
    departments.ForEach(s => context.Departments.AddOrUpdate(d => d.Name, s));
    context.SaveChanges();
    
    var courses = new List<Course>
    {
        new Course { CourseID = 1050, Title = "Chemistry",      Credits = 3, DepartmentID = 3 },
        new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4 },
        new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4 },
        new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2 },
        new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2 },
        new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1 },
        new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1 }
    };
    courses.ForEach(s => context.Courses.AddOrUpdate(s));
    context.SaveChanges();
    
    courses[0].Instructors.Add(instructors[0]);
    courses[0].Instructors.Add(instructors[1]);
    courses[1].Instructors.Add(instructors[2]);
    courses[2].Instructors.Add(instructors[2]);
    courses[3].Instructors.Add(instructors[3]);
    courses[4].Instructors.Add(instructors[3]);
    courses[5].Instructors.Add(instructors[3]);
    courses[6].Instructors.Add(instructors[3]);
    context.SaveChanges();
    
  2. への参照 List には、名前空間のステートメントがまだないため、 using その下に赤い波線が含まれています。 のいずれかのインスタンス List を右クリックし、[ 解決] をクリックし、[ System.Collections.Generic の使用] をクリックします。

    using ステートメントで解決する

    このメニュー選択により、ファイルの先頭付近の using ステートメントに次のコードが追加されます。

    using System.Collections.Generic;
    
  3. Ctrl キーを押しながら Shift キーを押しながら B キーを押して、プロジェクトをビルドします。

これで、 プロジェクトは ContosoUniversity データベースをデプロイする準備ができました。 アプリケーションをデプロイした後、アプリケーションを初めて実行し、データベースにアクセスするページに移動すると、Code First によってデータベースが作成され、このメソッドが Seed 実行されます。

注意

メソッドにコードを Seed 追加することは、固定データをデータベースに挿入する多くの方法の 1 つです。 別の方法として、各移行クラスの メソッド UpDown メソッドにコードを追加します。 Upメソッドと Down メソッドには、データベースの変更を実装するコードが含まれています。 これらの例については、データベース更新プログラムのデプロイに 関するチュートリアルを 参照してください。

メソッドを使用して SQL ステートメントを実行するコードを Sql 記述することもできます。 たとえば、Department テーブルに Budget 列を追加していて、移行の一環としてすべての部門予算を $1,000.00 に初期化する場合は、その移行のメソッドに次のコード行を Up 追加できます。

Sql("UPDATE Department SET Budget = 1000");

メンバーシップ データベースのデプロイ用のスクリプトを作成する

Contoso University アプリケーションでは、ASP.NET メンバーシップ システムとフォーム認証を使用して、ユーザーの認証と承認を行います。 [ クレジットの更新] ページには、管理者ロールのユーザーのみがアクセスできます。

アプリケーションを実行し、[ コース] をクリックし、[ クレジットの更新] をクリックします。

[クレジットの更新] をクリックします

[クレジットの更新] ページには管理特権が必要なため、[ログイン] ページが表示されます。

ユーザー名として 「admin 」、パスワードとして 「devpwd 」と入力し、[ ログイン] をクリックします。

[ログイン] ページ

[ クレジットの更新] ページが表示されます。

[クレジットの更新] ページ

ユーザーとロールの情報は、Web.config ファイルの DefaultConnection 接続文字列で指定された aspnet-ContosoUniversity データベースにあります。

このデータベースは Entity Framework Code First によって管理されないため、移行を使用してデプロイすることはできません。 dbDacFx プロバイダーを使用してデータベース スキーマをデプロイし、初期データをデータベース テーブルに挿入するスクリプトを実行するように発行プロファイルを構成します。

Note

Visual Studio 2013では、新しい ASP.NET メンバーシップ システム (ASP.NET Identity という名前) が導入されました。 新しいシステムを使用すると、アプリケーション テーブルとメンバーシップ テーブルの両方を同じデータベースに保持でき、Code First Migrationsを使用して両方をデプロイできます。 サンプル アプリケーションでは、以前の ASP.NET メンバーシップ システムを使用します。これは、Code First Migrationsを使用してデプロイすることはできません。 このメンバーシップ データベースをデプロイする手順は、Entity Framework Code First によって作成されないSQL Server データベースをアプリケーションでデプロイする必要がある他のシナリオにも適用されます。

ここでは、通常、開発中と同じデータを運用環境で使用する必要はありません。 サイトを初めて展開する場合は、テスト用に作成したユーザー アカウントのほとんどまたはすべてを除外するのが一般的です。 したがって、ダウンロードしたプロジェクトには、開発ユーザーを含む aspnet-ContosoUniversity.mdf と、運用ユーザーを含む aspnet-ContosoUniversity-Prod.mdf という 2 つのメンバーシップ データベースがあります。 このチュートリアルでは、ユーザー名は 、adminnonadmin の両方のデータベースで同じです。 両方のユーザーは、開発データベースにパスワード devpwd を、運用データベースに prodpwd を持っています。

開発ユーザーをテスト環境に展開し、運用ユーザーをステージングと運用にデプロイします。 これを行うには、このチュートリアルで 2 つの SQL スクリプトを作成します。1 つは開発用、もう 1 つは運用環境用です。後のチュートリアルでは、それらを実行するように発行プロセスを構成します。

注意

メンバーシップ データベースには、アカウント パスワードのハッシュが格納されます。 あるコンピューターから別のコンピューターにアカウントを展開するには、ハッシュ ルーチンが移行先サーバーでソース コンピューターと異なるハッシュを生成しないようにする必要があります。 既定のアルゴリズムを変更しない限り、ASP.NET ユニバーサル プロバイダーを使用すると、同じハッシュが生成されます。 既定のアルゴリズムは HMACSHA256 で、Web.config ファイルの machineKey 要素の検証属性で指定されます。

データデプロイ スクリプトは、SQL Server Management Studio (SSMS) を使用するか、サードパーティのツールを使用して手動で作成できます。 このチュートリアルの残りの部分では、SSMS で行う方法について説明しますが、SSMS をインストールして使用しない場合は、完成したバージョンのプロジェクトからスクリプトを取得し、ソリューション フォルダーに保存するセクションに進むことができます。

SSMS をインストールするには、[ENU\x64\SQLManagementStudio_x64_ENU.exe ] または [ENU\x86\SQLManagementStudio_x86_ENU.exe] をクリックして、ダウンロード センター: Microsoft SQL Server 2012 Express からインストールします。 お使いのシステムに間違ったシステムを選択した場合、インストールに失敗し、もう一方を試すことができます。

(これは 600 メガバイトのダウンロードであることに注意してください。インストールに時間がかかる場合があり、コンピューターの再起動が必要になります)。

SQL Server インストール センターの最初のページで、[新規SQL Serverスタンドアロン インストール] をクリックするか、既存のインストールに機能を追加し、指示に従って既定の選択肢を受け入れます。

開発データベース スクリプトを作成する

  1. SSMS を実行します。

  2. [サーバーへの接続] ダイアログ ボックスで、サーバー名として「(localdb)\v11.0」と入力し、[認証][Windows 認証] に設定したままにして、[接続] をクリックします。

    SSMS Connect to Server

  3. オブジェクト エクスプローラー ウィンドウで、[データベース] を展開し、[aspnet-ContosoUniversity] を右クリックし、[タスク] をクリックして、[スクリプトの生成] をクリックします。

    SSMS でスクリプトを生成する

  4. [ スクリプトの生成と発行 ] ダイアログ ボックスで、[ スクリプト オプションの設定] をクリックします。

    既定値は [データベース全体とすべてのデータベース オブジェクトをスクリプト化する] であり、これが目的であるため、[オブジェクトの選択] ステップをスキップできます。

  5. [詳細設定] をクリックします。

    SSMS スクリプト オプション

  6. [ スクリプトの詳細オプション] ダイアログ ボックスで、下にスクロールして [スクリプトを作成するデータの種類] に移動し、ドロップダウン リストの [ データのみ ] オプションをクリックします。

  7. スクリプト USE DATABASE を False に変更します。 USE ステートメントは、Azure SQL Database では無効であり、テスト環境でSQL Server Expressにデプロイする必要はありません。

    SSMS スクリプト データのみ、USE ステートメントなし

  8. [OK] をクリックします。

  9. [ スクリプトの生成と発行 ] ダイアログ ボックスの [ ファイル名 ] ボックスには、スクリプトを作成する場所が指定されます。 ソリューション フォルダー (ContosoUniversity.sln ファイルを含むフォルダー) へのパスとファイル名を aspnet-data-dev.sql に変更します。

  10. [ 次へ ] をクリックして [ 概要 ] タブに移動し、もう一度 [ 次へ ] をクリックしてスクリプトを作成します。

    SSMS スクリプトが作成されました

  11. [完了] をクリックします。

運用データベース スクリプトを作成する

運用データベースでプロジェクトを実行していないため、LocalDB インスタンスにまだアタッチされていません。 そのため、まずデータベースをアタッチする必要があります。

  1. SSMS オブジェクト エクスプローラーで、[データベース] を右クリックし、[アタッチ] をクリックします。

    SSMS アタッチ

  2. [データベースのアタッチ] ダイアログ ボックスで、[追加] をクリックし、App_Data フォルダー内の aspnet-ContosoUniversity-Prod.mdf ファイルに移動します。

    SSMS アタッチする .mdf ファイルを追加する

  3. [OK] をクリックします。

  4. 前に使用したのと同じ手順に従って、運用ファイルのスクリプトを作成します。 スクリプト ファイルに aspnet-data-prod.sql という名前を付けます

まとめ

両方のデータベースをデプロイする準備が整い、ソリューション フォルダーに 2 つのデータ配置スクリプトがあります。

データ展開スクリプト

次のチュートリアルでは、配置に影響するプロジェクト設定を構成し、配置されたアプリケーションで異なる必要がある設定の自動 Web.config ファイル変換を設定します。

説明

NuGet の詳細については、「 NuGet を使用してプロジェクト ライブラリを管理する 」および 「NuGet のドキュメント」を参照してください。 NuGet を使用しない場合は、NuGet パッケージを分析して、インストール時の動作を判断する方法を学習する必要があります。 (たとえば、Web.config変換の構成、ビルド時に実行する PowerShell スクリプトの構成など)NuGet のしくみの詳細については、「パッケージと構成ファイルとソース コード変換の作成と発行」を参照してください。