次の方法で共有


Visual Studio または Visual Web Developer を使用したSQL Server Compactを使用した ASP.NET Web アプリケーションの配置: SQL Server Compact データベースの配置 - 2/12

作成者: Tom Dykstra

スタート プロジェクトをダウンロードする

この一連のチュートリアルでは、Visual Studio 2012 RC または Visual Studio Express 2012 RC for Web を使用して、SQL Server Compact データベースを含む ASP.NET Web アプリケーション プロジェクトをデプロイ (発行) する方法について説明します。 Web 発行更新プログラムをインストールする場合は、Visual Studio 2010 を使用することもできます。 シリーズの概要については、シリーズ の最初のチュートリアルを参照してください。

Visual Studio 2012 の RC リリース後に導入された展開機能を示すチュートリアルでは、SQL Server Compact以外のSQL Serverエディションを展開する方法と、Azure App Service Web Appsに展開する方法については、「Visual Studio を使用した Web 配置の ASP.NET」を参照してください。

概要

このチュートリアルでは、デプロイ用に 2 つのSQL Server Compact データベースとデータベース エンジンを設定する方法について説明します。

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

アプリケーションの 2 つのデータベース内のデータベース構造とデータの一部 (すべてではない) もデプロイする必要があります。 通常、アプリケーションを開発するときに、ライブ サイトに展開しないデータベースにテスト データを入力します。 ただし、デプロイする運用データを入力することもできます。 このチュートリアルでは、展開時に必要なソフトウェアと正しいデータが含まれるように Contoso University プロジェクトを構成します。

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

SQL Server CompactとSQL Server Express

サンプル アプリケーションでは、SQL Server Compact 4.0 を使用します。 このデータベース エンジンは、Web サイトの比較的新しいオプションです。以前のバージョンのSQL Server Compactは、Web ホスティング環境では機能しません。 SQL Server Compactには、SQL Server Expressを使用して開発し、完全なSQL Serverにデプロイする一般的なシナリオと比較して、いくつかの利点があります。 選択したホスティング プロバイダーによっては、完全なSQL Server データベースをサポートするために追加料金が発生するプロバイダーもあるため、SQL Server Compactデプロイの方がコストが安くなる場合があります。 データベース エンジン自体を Web アプリケーションの一部としてデプロイできるため、SQL Server Compactに追加料金はかかりません。

ただし、その制限事項にも注意する必要があります。 SQL Server Compactでは、ストアド プロシージャ、トリガー、ビュー、またはレプリケーションはサポートされていません。 (SQL Server CompactでサポートされていないSQL Server機能の完全な一覧については、「SQL Server CompactとSQL Serverの違い」を参照してください)。また、SQL Server ExpressおよびSQL Server データベースのスキーマとデータを操作するために使用できるツールの一部は、SQL Server Compactでは機能しません。 たとえば、SQL Server Compact データベースを使用して Visual Studio でSQL Server Management StudioまたはSQL Server Data Toolsを使用することはできません。 SQL Server Compact データベースを操作するためのその他のオプションがあります。

  • Visual Studio で Server エクスプローラーを使用できます。これにより、SQL Server Compactのデータベース操作機能が制限されます。
  • Server エクスプローラーよりも多くの機能を備える WebMatrix のデータベース操作機能を使用できます。
  • SQL Server Compact ツールボックスSQL Compact データおよびスキーマ スクリプト ユーティリティなど、比較的フル機能のサードパーティ製ツールやオープンソース ツールを使用できます。
  • 独自の DDL (データ定義言語) スクリプトを記述して実行して、データベース スキーマを操作できます。

SQL Server Compactから始めてから、ニーズの進化に合わせて後でアップグレードできます。 このシリーズの以降のチュートリアルでは、SQL Server Compact から SQL Server Express に移行し、SQL Serverに移行する方法について説明します。 ただし、新しいアプリケーションを作成し、近い将来にSQL Serverが必要になると予想される場合は、SQL ServerまたはSQL Server Expressから始めるのが最善の方法です。

配置用のSQL Server Compact データベース エンジンの構成

Contoso University アプリケーションのデータ アクセスに必要なソフトウェアは、次の NuGet パッケージをインストールすることによって追加されました。

これらのリンクは、これらのパッケージの現在のバージョンを指しています。これは、このチュートリアル用にダウンロードしたスターター プロジェクトにインストールされているバージョンよりも新しい可能性があります。 ホスティング プロバイダーにデプロイする場合は、Entity Framework 5.0 以降を使用していることを確認してください。 以前のバージョンのCode First Migrationsには完全信頼が必要であり、多くのホスティング プロバイダーでは、アプリケーションは中程度の信頼で実行されます。 中程度の信頼の詳細については、「 テスト環境としての IIS への展開 」チュートリアルを参照してください。

NuGet パッケージのインストールでは、通常、このソフトウェアをアプリケーションと共に展開するために必要なすべての処理が行われます。 場合によっては、ソリューションをビルドするたびに実行されるWeb.config ファイルの変更や PowerShell スクリプトの追加などのタスクが含まれます。 NuGet を使用せずにこれらの機能 (SQL Server Compactや Entity Framework など) のサポートを追加する場合は、同じ作業を手動で実行できるように、NuGet パッケージのインストールが何を行うかを確認してください。

デプロイを成功させるために行う必要があるすべてを NuGet が処理しない例外が 1 つあります。 SqlServerCompact NuGet パッケージは、プロジェクト bin フォルダーの下にある x86 および amd64 サブフォルダーにネイティブ アセンブリをコピーするビルド後スクリプトをプロジェクトに追加しますが、スクリプトにはプロジェクトにこれらのフォルダーは含まれません。 その結果、手動でプロジェクトに含めない限り、Web 配置はコピー先の Web サイトにコピーされません。 (この動作は既定の展開構成の結果です。これらのチュートリアルでは使用しない別のオプションは、この動作を制御する設定を変更することです。変更できる設定は、[プロジェクトのプロパティ] ウィンドウの [パッケージ/発行 Web] タブの [展開するアイテム] でアプリケーションを実行するために必要なファイルのみです。この設定を変更すると、必要以上に多くのファイルが運用環境にデプロイされる可能性があるため、通常は推奨されません。代替方法の詳細については、「プロジェクトのプロパティの構成」チュートリアルを参照してください)。

プロジェクトをビルドし、まだ行っていない場合は、ソリューション エクスプローラー[すべてのファイルを表示] をクリックします。 [ 最新の情報に更新] をクリックする必要がある場合もあります。

Solution_Explorer_Show_All_Files

bin フォルダーを展開して amd64 フォルダーと x86 フォルダーを表示し、それらのフォルダーを選択して右クリックし、[プロジェクトに含める] を選択します。

amd64_and_x86_in_Solution_Explorer.png

フォルダー アイコンが変わると、フォルダーがプロジェクトに含まれていることが示されます。

Solution_Explorer_amd64_included.png

Application Database Deployment のCode First Migrationsの構成

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

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

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

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

School_database_diagram

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

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 初期化子クラスを指定する要素を appSettings 要素から削除します。 appSettings 要素は次のようになります。

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

Note

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

次に、Code First Migrationsを有効にします。

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

[ツール] メニューの [NuGet パッケージ マネージャー] をクリックし、[パッケージ マネージャー コンソール] をクリックします。

Selecting_Package_Manager_Console

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

enable-migrations_command

このコマンドは、ContosoUniversity.DAL プロジェクトの新しい Migrations フォルダーに Configuration.cs ファイルを作成します。

Migrations_folder_in_Solution_Explorer

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

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, Instructors = new List<Instructor>() },
    new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1, Instructors = new List<Instructor>() },
    new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1, Instructors = new List<Instructor>() }
};
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();

への参照 List には、名前空間のステートメントがまだないため、 using その下に赤い波線が含まれています。 のいずれかのインスタンス List を右クリックし、[ 解決] をクリックし、[ System.Collections.Generic の使用] をクリックします。

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

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

using System.Collections.Generic;

注意

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

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

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

このチュートリアルで示すこの例では、AddOrUpdateCode First Migrations Configuration クラスの メソッドで Seed メソッドを使用します。 Code First Migrationsは、移行のたびに メソッドをSeed呼び出します。このメソッドは、既に挿入されている行を更新するか、まだ存在しない場合は挿入します。 この方法は AddOrUpdate 、シナリオに最適な選択肢ではない可能性があります。 詳細については、Julie Lerman のブログの 「EF 4.3 AddOrUpdate メソッドに注意 する」を参照してください。

Ctrl キーを押しながら Shift キーを押しながら B キーを押して、プロジェクトをビルドします。

次の手順では、最初の移行用の DbMigration クラスを作成します。 この移行で新しいデータベースを作成する必要があるため、既に存在するデータベースを削除する必要があります。 SQL Server Compact データベースは、App_Data フォルダーの .sdf ファイルに含まれています。 ソリューション エクスプローラーで、ContosoUniversity プロジェクトのApp_Dataを展開して、.sdf ファイルで表される 2 つのSQL Server Compact データベースを表示します。

School.sdf ファイルを右クリックし、[削除] をクリックします

sdf_files_in_Solution_Explorer

[パッケージ マネージャー コンソール] ウィンドウで、コマンド "add-migration Initial" を入力して初期移行を作成し、"Initial" という名前を付けます。

add-migration_command

Code First Migrationsは Migrations フォルダーに別のクラス ファイルを作成し、このクラスにはデータベース スキーマを作成するコードが含まれています。

パッケージ マネージャー コンソールで、"update-database" コマンドを入力してデータベースを作成し、Seed メソッドを実行します。

update-database_command

(テーブルが既に存在し、作成できないことを示すエラーが発生した場合は、データベースを削除してから を実行する前にアプリケーションを実行した update-database可能性があります。その場合は、 School.sdf ファイルをもう一度削除し、コマンドを update-database 再試行してください。)

アプリケーションを実行します。 [学生] ページは空になっていますが、[講師] ページには講師が含まれています。 これは、アプリケーションをデプロイした後に運用環境で得られるものです。

Empty_Students_page

Instructors_page_after_initial_migration

これで、プロジェクトは School データベースをデプロイする準備ができました。

展開用のメンバーシップ データベースの作成

Contoso University アプリケーションでは、ASP.NET メンバーシップ システムとフォーム認証を使用して、ユーザーの認証と承認を行います。 そのページの 1 つは、管理者のみがアクセスできます。 このページを表示するには、アプリケーションを実行し、[コース] のポップアップ メニューから [ クレジットの更新 ] を選択 します。 [クレジットの更新] ページの使用が許可されているのは管理者だけなので、アプリケーションに [ログイン] ページが表示されます。

Log_in_page

パスワード "Pas$w0rd" を使用して "admin" としてログインします ("w0rd" の文字 "o" の代わりに 0 を指定してください)。 ログインすると、[ クレジットの更新 ] ページが表示されます。

Update_Credits_page

サイトを初めて展開する場合は、テスト用に作成したユーザー アカウントのほとんどまたはすべてを除外するのが一般的です。 この場合は、管理者アカウントをデプロイし、ユーザー アカウントはデプロイしません。 テスト アカウントを手動で削除するのではなく、運用環境で必要な管理者ユーザー アカウントを 1 つだけ持つ新しいメンバーシップ データベースを作成します。

Note

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

メンバーシップ データベースはCode First Migrationsによって管理されず、(School データベース用に存在するため) テスト アカウントを使用してデータベースをシードする自動初期化子はありません。 そのため、テスト データを使用できるように、新しいデータベースを作成する前にテスト データベースのコピーを作成します。

ソリューション エクスプローラーで、App_Data フォルダー内の aspnet.sdf ファイルの名前を aspnet-Dev.sdf に変更します。 (コピーを作成せず、名前を変更するだけです。すぐに新しいデータベースを作成します)。

ソリューション エクスプローラーで、Web プロジェクト (ContosoUniversity.DAL ではなく ContosoUniversity) が選択されていることを確認します。 次に、[ プロジェクト ] メニューの [ASP.NET 構成 ] を選択して 、Web サイト管理ツール (WAT) を実行します。

[セキュリティ] タブをクリックします。

WAT_Security_tab

[ ロールの作成または管理] をクリックし、 管理者 ロールを追加します。

WAT_Create_New_Role

[ セキュリティ ] タブに戻り、[ ユーザーの作成] をクリックし、管理者としてユーザー "admin" を追加します。 [ユーザーの作成] ページで [ユーザーの作成] ボタンをクリックする前に、必ず [管理者チェック] ボックスを選択してください。 このチュートリアルで使用するパスワードは "Pas$w0rd" であり、任意のメール アドレスを入力できます。

WAT_Create_User

ブラウザーを閉じます。 ソリューション エクスプローラーで、更新ボタンをクリックして、新しい aspnet.sdf ファイルを表示します。

New_aspnet.sdf_in_Solution_Explorer

aspnet.sdf を右クリックし、[プロジェクトに含める] を選択します。

開発と運用データベースの区別

このセクションでは、開発バージョンが School-Dev.sdf と aspnet-Dev.sdf であり、運用バージョンが School-Prod.sdf と aspnet-Prod.sdf になるようにデータベースの名前を変更します。 これは必要ありませんが、そうすることで、データベースのテストバージョンと運用バージョンが混乱するのを防ぐことができます。

ソリューション エクスプローラーで、[更新] をクリックし、App_Data フォルダーを展開して、先ほど作成した School データベースを表示します。右クリックし、[プロジェクトに含める] を選択します。

Including_School.sdf_in_project

aspnet.sdf の名前を aspnet-Prod.sdf に変更します。

School.sdf の名前を School-Dev.sdf に変更します。

Visual Studio でアプリケーションを実行するときに、データベース ファイルの -Prod バージョンを使用しない場合は、 -Dev バージョンを使用します。 したがって、データベースの -Dev バージョンを指すように、Web.config ファイル内の接続文字列を変更する必要があります。 (School-Prod.sdf ファイルは作成していませんが、Code First ではアプリを初めて実行するときに運用環境でそのデータベースが作成されるため、問題ありません)。

アプリケーション Web.config ファイルを開き、接続文字列を見つけます。

<configuration>
  <!-- Settings -->
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <!-- Settings -->
</configuration>

"aspnet.sdf" を "aspnet-Dev.sdf" に変更し、"School.sdf" を "School-Dev.sdf" に変更します。

<configuration>
  <!-- Settings -->
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet-Dev.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School-Dev.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <!-- Settings -->
</configuration>

SQL Server Compact データベース エンジンと両方のデータベースをデプロイする準備ができました。 次のチュートリアルでは、開発、テスト、および運用環境で異なる必要がある設定に対して 、ファイルの 自動Web.config変換を設定します。 (変更する必要がある設定の中には接続文字列がありますが、発行プロファイルを作成するときに後でこれらの変更を設定します)。

説明

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