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

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

このチュートリアル シリーズでは、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 は、SQL Server Express の特別な実行モードであり、データベースを .mdf ファイルとして操作できるようになります。 通常、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 では完全な信頼が必要であり、ほとんどのホスティング プロバイダーでは、中程度の信頼でアプリケーションが実行されます。 中程度の信頼について詳しくは、テスト環境としての IIS への配置に関するチュートリアルをご覧ください。

アプリケーション データベース配置のために Code First Migrations を構成する

Contoso University アプリケーション データベースは、Code First で管理されており、Code First Migrations を使って配置します。 Code First Migrations を使ったデータベース配置の概要については、このシリーズの最初のチュートリアルをご覧ください。

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

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

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

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

School_database_diagram

これらのチュートリアルでは、サイトを最初に配置するときに Student および Enrollment テーブルが空になっている必要があると仮定します。 他のテーブルには、アプリケーションが稼働し始めるときに事前に読み込まれている必要があるデータが含まれています。

初期化子を無効にする

Code First Migrations を使うため、DropCreateDatabaseIfModelChanges Code First 初期化子を使う必要はありません。 この初期化子のコードは、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 を有効にしており、そのメソッドを使って初期化子を指定している場合は、そのコード行を削除します。

Note

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 command

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

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

    Migrations folder

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

    この enable-migrations コマンドでは、データベースが既に存在するため自動的に最初の移行が作成されました。 別の方法として、Migrations でデータベースが作成されるようにすることもできます。 これを行うには、Migrations を有効にする前に、[サーバー エクスプローラー][SQL Server オブジェクト エクスプローラー] を使って ContosoUniversity データベースを削除します。 Migrations を有効にした後、コマンド「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 のインスタンスの 1 つを右クリックし、[解決] をクリックしてから、[System.Collections.Generic の使用] をクリックします。

    Resolve with using statement

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

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

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

Note

Seed メソッドへのコードの追加は、固定データをデータベースに挿入するための多数の方法の 1 つです。 別の方法としては、各移行クラスの Up および Down メソッドへのコードの追加があります。 Up および Down メソッドには、データベースの変更点を実装するコードが含まれています。 これらの例については、「データベース更新の配置」チュートリアルをご覧ください。

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

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

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

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

アプリケーションを実行し、[Courses] (コース) をクリックしてから、[Update Credits] (クレジットの更新) をクリックします。

Click Update Credits

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

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

Log in page

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

Update Credits page

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

このデータベースは Entity Framework Code First で管理されていないため、Migrations を使ってそれを配置することはできません。 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 つのメンバーシップ データベースがあります。 このチュートリアルでは、ユーザー名は両方のデータベースで同じであり、admin と nonadmin です。 どちらのユーザーのパスワードも、開発データベースでは devpwd、、運用データベースでは prodpwd です。

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

Note

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

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

SSMS をインストールするには、ENU\x64\SQLManagementStudio_x64_ENU.exeENU\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 Generate Scripts

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

    [オブジェクトの選択] の手順は、既定値が [データベース全体とすべてのデータベース オブジェクトのスクリプトを作成] でありこれが目的であるため、スキップしてかまいません。

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

    SSMS Scripting Options

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

  7. [USE DATABASE のスクリプトを作成][False] に変更します。 Azure SQL Database では USE ステートメントを使用しません。また、SQL Server Express をテスト環境にデプロイする場合、USE ステートメントは必要ありません。

    SSMS Script Data Only, no USE statement

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

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

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

    SSMS Script Created

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

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

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

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

    SSMS Attach

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

    SSMS Add .mdf file to attach

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

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

まとめ

これで、両方のデータベースの配置準備が整いました。ソリューション フォルダーには 2 つのデータ配置スクリプトがあります。

Data deployment scripts

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

その他の情報

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