Visual Studio または Visual Web Developer を使用した SQL Server Compact を含む ASP.NET Web アプリケーションのデプロイ: SQL Server への移行 - 10/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 を使用した ASP.NET Web デプロイ」をご覧ください。

概要

このチュートリアルでは、SQL Server Compact から SQL Server に移行する方法について説明します。 SQL Server への移行を検討する理由の 1 つとして、ストアド プロシージャ、トリガー、ビュー、レプリケーションといった、SQL Server Compact にはない SQL Server の機能を活用できることが挙げられます。 SQL Server Compact と SQL Server の違いの詳細については、「SQL Server Compact のデプロイ」チュートリアルを参照してください。

開発用途における SQL Server Express と SQL Server の比較

SQL Server へのアップグレードを決定したら、開発環境およびテスト環境において SQL Server または SQL Server Express を使用することをご検討ください。 SQL Server Compact は他の SQL Server バージョンと、ツールのサポートやデータベース エンジン機能だけでなく、プロバイダーの実装方法も異なります。 こうした違いによって、同一のコードでも実行結果が変わる可能性があります。 そのため、SQL Server Compact を開発用データベースとして使い続ける場合、運用環境へデプロイする前に、必ず SQL Server もしくは SQL Server Express を使用したテスト環境でサイトを徹底的に検証することをお勧めします。

SQL Server Compact とは異なり、SQL Server Express は本質的に SQL Server と同一のデータベース エンジンであり、フル バージョンの SQL Server と同じ .NET プロバイダーが使用されています。 SQL Server Express でテストを行うことで、SQL Server を使ったときと同じ結果になることがほぼ確実です。 SQL Server Express は、SQL Server と同様のデータベース ツールをほぼすべて利用可能です (SQL Server Profiler を除く)。ストアド プロシージャやビュー、トリガー、レプリケーションといった機能も SQL Server と同じようにサポートしています。 (ただし、通常は運用 Web サイトでは、通常はフル バージョンの SQL Server を使う必要があります。SQL Server Express は共有ホスティング環境でも動作しますが、本来は想定されていません。多くのホスティング プロバイダーはサポートしていません。)

Visual Studio 2012 を使用している場合、開発環境としては通常 SQL Server Express LocalDB を選択することになります。その理由は、Visual Studio に SQL Server Express LocalDB が既定でインストールされるためです。 ただし、LocalDB は IIS では動作しないため、テスト環境では SQL Server または SQL Server Express を使用する必要があります。

データベースの統合と分割

Contoso University アプリケーションには、メンバーシップ データベース (aspnet.sdf) とアプリケーション データベース (School.sdf) の 2 つの SQL Server Compact データベースがあります。 移行する際、これらのデータベースを 2 つの独立したデータベースとして移行するか、それとも 1 つのデータベースに統合して移行するかを選択できます。 アプリケーション データベースとメンバーシップ データベース間のデータベース結合を容易にするため、これらを統合することも可能です。 利用するホスティング プランによっては、データベースを統合する方がメリットがある場合もあります。 たとえば、ホスティング サービスによっては、複数のデータベースを使用すると追加料金が発生したり、そもそも複数のデータベースを許可していなかったりすることがあります。 このチュートリアルで利用している Cytanium Lite ホスティング アカウントがまさにそうです。このアカウントでは SQL Server データベースは 1 つしか使えません。

このチュートリアルでは、次の方法で 2 つのデータベースを移行します。

  • 開発環境では、2 つの LocalDB データベースに移行します。
  • テスト環境では、2 つの SQL Server Express データベースに移行します。
  • 運用環境では、統合された 1 つのフル バージョンの SQL Server データベースとして移行します。

リマインダー: チュートリアルの間、エラー メッセージが表示されたり、うまくいかなかったりすることがある場合は、必ずトラブルシューティングに関するページを確認してください。

SQL Server Express のインストール

SQL Server Express は Visual Studio 2010 では既定で自動的にインストールされますが、Visual Studio 2012 では既定ではインストールされません。 SQL Server 2012 Express をインストールするには、こちらのリンクをクリックします

ENU/x64/SQLEXPR_x64_ENU.exe または ENU/x86/SQLEXPR_x86_ENU.exe を選択し、インストール ウィザードでは設定を既定値のままにします。 インストール オプションの詳細については、「SQL Server 2012 をインストール ウィザードからインストールする (セットアップ)」を参照してください。

テスト環境用の SQL Server Express データベースの作成

次の手順では、ASP.NET メンバーシップと School データベースを作成します。

[表示] メニューから [サーバー エクスプローラー] (Visual Web Developer ではデータベース エクスプローラー) を選択し、[データ接続] を右クリックし、[新しい SQL Server データベースの作成] を選択します。

Selecting_Create_New_SQL_Server_Database

[新しい SQL Server データベースの作成] ダイアログ ボックスで、[サーバー名] ボックスに「.\SQLExpress」と入力し、[新しいデータベース名 ] ボックスに「aspnet-Test」と入力して、[OK] をクリックします。

Create_New_SQL_Server_Database_aspnet

同様の手順で、「School-Test」という名前の SQL Server Express School データベースを新規作成します。

(ここでデータベース名の末尾に「Test」を付けているのは、開発環境用に同じデータベースを別途作成する予定があり、テスト環境と開発環境のデータベースを明確に区別する必要があるからです。)

サーバー エクスプローラーに、新しく作成した 2 つのデータベースが表示されます。

New_databases_in_Server_Explorer

新しいデータベースの許可スクリプトの作成

開発用コンピューター上の IIS でアプリケーションを実行すると、アプリケーションは既定のアプリケーション プールの資格情報を使用してデータベースにアクセスします。 ただし、既定では、アプリケーション プール ID にはデータベースを開く権限がありません。 そのため、そのアクセス許可を付与するスクリプトを実行する必要があります。 このセクションでは、アプリケーションを IIS 上で実行したときにデータベースを開けるようにするためのスクリプトを作成します。

運用環境へのデプロイ チュートリアルで作成したソリューションの SolutionFiles フォルダー内に、Grant.sql という名前の SQL ファイルを新規作成します。 次の SQL コマンドをファイルにコピーし、ファイルを保存して閉じます。

IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
    CREATE LOGIN [IIS APPPOOL\DefaultAppPool] 
      FROM WINDOWS WITH DEFAULT_DATABASE=[master], 
      DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [ContosoUniversityUser] 
  FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_owner', 'ContosoUniversityUser'
GO

Note

このスクリプトは、本チュートリアルで説明している SQL Server 2008 および Windows 7 の IIS 設定で動作するよう設計されています。 異なるバージョンの SQL Server や Windows を使用している場合、または IIS の設定が異なる場合は、このスクリプトの変更が必要になることがあります。 SQL Server スクリプトの詳細については、SQL Server オンライン ブックを参照してください。

Note

セキュリティに関する注意 このスクリプトは、実行時にデータベースにアクセスするユーザーに db_owner アクセス権を付与します。運用環境では、この設定が必要になります。 一部のシナリオでは、デプロイ時にのみ、完全なデータベース スキーマ更新アクセス許可を持つユーザーを指定し、実行時には、データの読み取りと書き込みのアクセス許可のみを持つ別のユーザーを指定することも可能です。 詳細については、「テスト環境としての IIS へのデプロイ」の「Code First Migrations の Web.config 自動変更の確認」を参照してください。

テスト環境におけるデータベース デプロイの構成

次に、Visual Studio で各データベースに対して以下のタスクを実行できるよう構成します。

  • 宛先データベースにソース データベースの構造 (テーブル、列、制約など) を作成する SQL スクリプトを生成します。
  • ソース データベースのデータを宛先データベースの対応するテーブルに挿入するための SQL スクリプトを作成します。
  • 生成されたスクリプトと、作成した許可スクリプトを宛先データベースで実行します。

[プロジェクトのプロパティ] ウィンドウを開き、[SQL のパッケージ化/公開] タブを選択します。

[構成] ドロップダウン リストで、[アクティブ (リリース)] または [リリース] が選択されていることを確認します。

[このページを有効にする] をクリックします。

Package_Publish_SQL_tab_Enable_This_page

[SQL のパッケージ化/公開] タブは、従来のデプロイ方法を指定するため、通常は無効になっています。 ほとんどのシナリオでは、Web の公開ウィザードでデータベースのデプロイを構成する 必要があります。 SQL Server Compact から SQL Server または SQL Server Express に移行する場合は特殊なケースで、この手法が適しています。

[Web.config からインポート] をクリックします。

Selecting_Import_from_Web.config

Visual Studio は Web.config ファイル内の接続文字列を検索し、メンバーシップ データベースと School データベース用の接続文字列を特定します。そして、[データベース エントリ] テーブルに、各接続文字列に対応する行を追加します。 検出された接続文字列は、既存の SQL Server Compact データベース用のものです。次手順では、これらのデータベースのデプロイ方法とデプロイ先を構成します。

データベースのデプロイ設定は、[データベース エントリ] テーブルの下にある [データベース エントリの詳細] セクションで入力します。 [データベース エントリの詳細] セクションに表示される設定は、次の図に示すように、[データベース エントリ] テーブルで選択されている行に対応しています。

Database_Entry_Details_section_of_Package_Publish_SQL_tab

メンバーシップ データベースのデプロイ設定の構成

メンバーシップ データベースに適用する設定を構成するには、[データベース エントリ] テーブルで [DefaultConnection-Deployment] 行を選択します。

[宛先データベースの接続文字列] には、新しい SQL Server Express メンバーシップ データベースを指す接続文字列を入力します。 必要な接続文字列は、サーバー エクスプローラーから取得できます。 サーバー エクスプローラー[データ接続] を展開し、[aspnetTest] データベースを選択します。そして [プロパティ] ウィンドウから [接続文字列] の値をコピーします。

aspnet_connection_string_in_Server_Explorer

以下に、同じ接続文字列を再現します。

Data Source=.\SQLExpress;Initial Catalog=aspnet-Test;Integrated Security=True;Pooling=False

この接続文字列をコピーし、[SQL パッケージ/公開] タブの [宛先データベースの接続文字列] に貼り付けます。

[既存のデータベースからデータやスキーマを取得する] が選択されていることを確認します。 これにより、SQL スクリプトが自動的に生成され、宛先データベースで実行されます。

[ソース データベースの接続文字列] の値は Web.config ファイルから抽出され、開発用の SQL Server Compact データベースを指します。 これは、後で宛先データベースで実行されるスクリプトを生成するために使用されるソース データベースです。 運用環境版のデータベースをデプロイする必要があるため、「aspnet-Dev.sdf」を「aspnet-Prod.sdf」に変更します。

データベース構造に加えて、データ (ユーザー アカウントとロール) もコピーする必要があるため、[データベース スクリプト オプション][スキーマのみ] から [スキーマとデータ] に変更します。

先ほど作成した許可スクリプトを実行するようにデプロイを構成するには、それらを [データベース スクリプト] セクションに追加する必要があります。 [スクリプトの追加] をクリックし、[SQL スクリプトの追加]ダイアログ ボックスで、許可スクリプトを保存したフォルダー (ソリューション ファイルが格納されているフォルダー) に移動します。 Grant.sql という名前のファイルを選択し、[開く] をクリックします。

Select_File_dialog_box_grant_script

これで、[データベース エントリ] における [DefaultConnection-Deployment] 行の設定は、次の図のようになっているはずです。

Database_Entry_Details_for_DefaultConnection_Test

School データベースのデプロイ設定の構成

次に、School データベースのデプロイ設定を構成するために、[データベース エントリ] テーブルで [SchoolContext-Deployment] 行を選択します。

先ほど使用した方法と同じ方法を使用して、新しい SQL Server Express データベースの接続文字列を取得できます。 [SQL パッケージ/公開] タブにある [宛先データベースの接続文字列] に、この接続文字列をコピーします。

Data Source=.\SQLExpress;Initial Catalog=School-Test;Integrated Security=True;Pooling=False

[既存のデータベースからデータやスキーマを取得する] が選択されていることを確認します。

[ソース データベースの接続文字列] の値は Web.config ファイルから抽出され、開発用の SQL Server Compact データベースを指します。 データベースを運用環境にデプロイするには、「School-Dev.sdf」を「School-Prod.sdf」に置き換えます。 (App_Data フォルダーには School-Prod.sdf ファイルを作成していないため、後ほど ContosoUniversity プロジェクト フォルダーの App_Data フォルダーに、テスト環境から School-Prod.sdf ファイルをコピーします。)

[データベース スクリプト オプション][スキーマとデータ] に変更します。

このデータベースに対しても、アプリケーション プール ID に読み取りと書き込みの権限を付与するスクリプトを実行する必要があるため、メンバーシップ データベースのときと同じように Grant.sql スクリプト ファイルを追加します。

設定が完了すると、[データベース エントリ][SchoolContext-Deployment] 行の設定は、次の図のようになります。

Database_Entry_Details_for_SchoolContext_Test

[SQL のパッケージ化/公開] タブの変更内容を保存します。

School-Prod.sdf ファイルを c:\inetpub\wwwroot\ContosoUniversity\App_Data フォルダーから、ContosoUniversity プロジェクトの App_Data フォルダーにコピーします。

許可スクリプトのトランザクション モードの指定

デプロイ プロセスでは、データベースのスキーマとデータをデプロイするためのスクリプトが生成されます。 既定では、これらのスクリプトはトランザクション内で実行されます。 ただし、カスタム スクリプト (許可スクリプトなど) は、既定ではトランザクション内で実行されません。 デプロイ プロセスでトランザクション モードが混在していると、デプロイ中にスクリプトを実行する際にタイムアウト エラーが発生する場合があります。 このセクションでは、カスタム スクリプトをトランザクション内で実行できるよう構成するため、プロジェクト ファイルを編集します。

ソリューション エクスプローラー で、ContosoUniversity プロジェクトを右クリックし、[プロジェクトのアンロード] を選択します。

Unload_Project_in_Solution_Explorer

その後、もう一度プロジェクトを右クリックして、[ContosoUniversity.csproj の編集] を選択します。

Edit_Project_in_Solution_Explorer

Visual Studio エディターには、プロジェクト ファイルの XML コンテンツが表示されます。 PropertyGroup 要素がいくつかあることに注意してください。 (画像では、PropertyGroup 要素の内容は省略されています。)

Project file editor window

Condition 属性のない最初の要素は、ビルド構成に関わらず適用される設定のためのものです。 PropertyGroup 要素のうち、1 つはデバッグ ビルド構成専用です (Condition 属性に注目)。もう 1 つはリリース ビルド構成専用、そして残りの 1 つはテスト ビルド構成専用となっています。 リリース ビルド構成用の PropertyGroup 要素内に、[SQL のパッケージ化/公開] タブでの設定を保持する PublishDatabaseSettings 要素があります。指定した許可スクリプトそれぞれに対応する Object 要素があります (「Grant.sql」が 2 つあることに注意してください)。 既定では、それぞれの許可スクリプトに対応する Source 要素の Transacted 属性は False に設定されています。

Transacted_false

Source 要素の Transacted 属性の値を True に設定します。

Transacted_true

プロジェクト ファイルを保存して閉じ、ソリューション エクスプローラー上でプロジェクトを右クリックして、[プロジェクトの再読み込み] を選択します。

Reload_project

Web.Config 変換による接続文字列の設定

[SQL のパッケージ化/公開] タブで指定した SQL Express の新規データベース用の接続文字列は、Web 配置がデプロイ時に宛先のデータベースを更新する目的でのみ利用されます。 デプロイされた Web.config ファイル内の接続文字列が新しい SQL Server Express データベースを参照するようにするには、Web.config 変換を設定する必要があります。 ([SQL のパッケージ化/公開] タブを使用する場合、公開プロファイルで接続文字列を構成することはできません。)

Web.Test.config を開き、connectionStrings 要素を次の connectionStrings 要素に置き換えます。 (ここではコンテキストを示すために周辺のコードも表示されていますが、コピーするのは connectionStrings 要素の部分だけで構いません。)

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=.\SQLExpress;Initial Catalog=aspnet-Test;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True" 
         providerName="System.Data.SqlClient"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    <add name="SchoolContext" 
         connectionString="Data Source=.\SQLExpress;Initial Catalog=School-Test;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True" 
         providerName="System.Data.SqlClient"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
  </connectionStrings>
  <!-- appSettings element, comments, and system.web element -->
</configuration>

このコードにより、デプロイされた Web.config ファイル内のすべての add 要素の connectionString 属性と providerName 属性が置き換えられます。 これらの接続文字列は、[SQL のパッケージ化/公開] タブに入力したものとは異なっています。Entity Framework とユニバーサル プロバイダーで必要となるため、設定「MultipleActiveResultSets=True」が追加されました。

SQL Server Compact のインストール

SqlServerCompact NuGet パッケージは、Contoso University アプリケーション向けの SQL Server Compact データベース エンジン アセンブリを提供します。 ただし、SQL Server データベースで実行するスクリプトを作成するために、Web 配置が SQL Server Compact データベースを読み取れるようにする必要があります。アプリケーション側で読み取れるようにする必要はありません。 Web 配置で SQL Server Compact データベースを読み取れるようにするには、Microsoft SQL Server Compact 4.0 SP1 のリンクから SQL Server Compact を開発用コンピューターにインストールします。

テスト環境へのデプロイ

テスト環境に公開するには、公開プロファイルのデータベース設定ではなく、[SQL のパッケージ化/公開] タブを使用してデータベース公開を行うように構成された公開プロファイルを作成する必要があります。

まず、既存のテスト プロファイルを削除します。

ソリューション エクスプローラーで ContosoUniversity プロジェクトを右クリックし、[公開] をクリックします。

[プロファイル] タブを選択します。

[プロファイルの管理] をクリックします。

[テスト] を選択し、[削除] をクリックしてから、[閉じる] をクリックします。

Web の公開ウィザードを 閉じ、この変更を保存します。

次に、新しいテスト プロファイルを作成し、それを使用してプロジェクトを公開します。

ソリューション エクスプローラーで ContosoUniversity プロジェクトを右クリックし、[公開] をクリックします。

[プロファイル] タブを選択します。

ドロップダウン リストから <[新規...] >を選択し、プロファイル名に「テスト」と入力します。

[サービス URL] ボックスに「localhost」と入力します。

[サイト/アプリケーション] ボックスに、「既定の Web サイト/ContosoUniversity」と入力します。

[宛先 URL] ボックスに「http://localhost/ContosoUniversity/」と入力します。

次へ をクリックします。

[設定] タブでは、[SQL のパッケージ化/公開] タブの設定が有効になっているという警告が表示され、[新しいデータベース公開の機能強化を有効にする] をクリックすることで設定をオーバーライドできます。 今回のデプロイでは、[SQL のパッケージ化/公開] タブの設定をオーバーライドする必要はないので、[次へ] をクリックします。

Publish_Web_wizard_Settings_tab_Migrate

[プレビュー] タブに「公開するデータベースが選択されていません」というメッセージが表示されますが、これは、データベースの公開が公開プロファイルで構成されていないことを意味します。

[発行] をクリックします。

Publish_Web_wizard_Preview_tab_Migrate

Visual Studio がアプリケーションをデプロイし、テスト環境におけるサイトのホーム ページをブラウザーで開きます。 Instructors ページを開いて、先ほど確認したデータと同じものが表示されているか確認します。 [学生の追加] ページを開き、新しい生徒を追加します。その後、[学生] ページで追加された学生が表示されることを確認します。 これにより、データベースが正常に更新できることを確認できます。 [クレジットの更新] ページを開いて (ログインが必要です)、メンバーシップ データベースが正しくデプロイされ、アクセスできることを確認します。

運用環境向けの SQL Server データベースの作成

テスト環境へのデプロイが完了したため、運用環境へのデプロイ設定に移行できます。 テスト環境と同様、まずはデプロイ先のデータベースを作成することから始めましょう。 概要で説明したように、Cytanium Lite ホスティング プランでは SQL Server データベースを 1 つしか利用できないため、2 つではなく 1 つのみデータベースを設定します。 メンバーシップ データベースと School SQL Server Compact データベースのすべてのテーブルとデータは、運用環境の 1 つの SQL Server データベースにまとめてデプロイされます。

http://panel.cytanium.comにある Cytanium コントロール パネルに移動します。 マウスカーソルを [データベース] の上に移動し、表示されたメニューから [SQL Server 2008] をクリックします。

Selecting_Databases_in_Control_Panel

SQL Server 2008 ページで、[データベースの作成] をクリックします。

Selecting_Create_Database

データベースに「School」という名前を付け、[保存] をクリックします。 (このページでは、自動的に「contosou」というプレフィックスが付加されます。そのため、実質的なデータベース名は「contosouSchool」となります。)

Naming_the_database

同じページにある [ユーザーの作成] をクリックします。 Cytanium のサーバーでは、Windows 統合セキュリティでアプリケーション プール ID にデータベースへのアクセス権を与えるのではなく、個別にデータベースを開く権限を有するユーザーを作成します。 運用環境の Web.config ファイルに含まれる接続文字列に、作成したユーザーの資格情報を追加します。 この手順では、前述の資格情報を作成します。

Creating_a_database_user

次のように、[SQL ユーザーのプロパティ] ページの必須フィールドに入力します。

  • 名前に「ContosoUniversityUser」と入力します。
  • パスワードを入力します。
  • 既定のデータベースに [contosouSchool] を選択します。
  • [contosouSchool] チェック ボックスをオンにします。

SQL_User_Properties_page

運用環境向けのデータベース デプロイの構成

これで、先ほどテスト環境に対して行ったのと同様に、[SQL のパッケージ化/公開] タブでデータベースのデプロイ設定を行う準備が整いました。

[プロジェクトのプロパティ] ウィンドウを開き、[SQL のパッケージ/公開] タブを選択し、[構成] ドロップダウン リストで [アクティブ (リリース)] または [リリース] が選択されていることを確認します。

それぞれのデータベースのデプロイ設定を構成する際、運用環境とテスト環境で大きく異なるのは、接続文字列の構成方法です。 テスト環境では、それぞれのデータベースごとに異なる宛先接続文字列を設定しましたが、運用環境では、両方のデータベースで同一の宛先接続文字列を使用します。 これは、運用環境では両方のデータベースを 1 つのデータベースに統合してデプロイするためです。

メンバーシップ データベースのデプロイ設定の構成

メンバーシップ データベースに適用される設定を構成するには、[データベース エントリ] テーブルで [DefaultConnection-Deployment] 行を選択します。

[宛先データベースの接続文字列] に、先ほど作成した運用環境用の SQL Server データベースを参照する接続文字列を入力します。 接続文字列は、ウェルカム メールに記載されています。 メールの本文のうち、接続文字列に関する部分には次のようなサンプルが含まれています。

Data Source=vserver01.cytanium.com;Initial Catalog={myDataBase};User Id={myUsername};Password={myPassword};

3 つの変数を適切な値に置き換えると、必要となる接続文字列は以下のような形式になります。

Data Source=vserver01.cytanium.com;Initial Catalog=contosouSchool;User Id=ContosoUniversityUser;Password=Password;

この接続文字列をコピーし、[SQL パッケージ/公開] タブの [宛先データベースの接続文字列] に貼り付けます。

[既存のデータベースからデータまたはスキーマを取得する] が選択された状態であることと、[データベース スクリプト オプション] の設定が [スキーマとデータ] のままになっていることを確認します。

[データベース スクリプト] ボックスで、Grant.sql スクリプトの横にあるチェック ボックスをオフにします。

Disable_Grant_script

School データベースのデプロイ設定の構成

続いて、School データベースの設定を行うため、[データベース エントリ] テーブル内の [SchoolContext-Deployment] 行を選択します。

[宛先データベースの接続文字列] に、メンバーシップ データベースに対して入力したものと同じ接続文字列をコピーします。

[既存のデータベースからデータまたはスキーマを取得する] が選択された状態であることと、[データベース スクリプト オプション] の設定が [スキーマとデータ] のままになっていることを確認します。

[データベース スクリプト] ボックスで、Grant.sql スクリプトの横にあるチェック ボックスをオフにします。

[SQL のパッケージ化/公開] タブの変更内容を保存します。

運用環境データベースの接続文字列のための Web.config 変換の設定

続いて、デプロイ先の Web.config ファイルに含まれる接続文字列が運用環境の新しいデータベースを指し示すように、Web.config の変換を設定します。 Web 配置で使用する [SQL のパッケージ/公開] タブに入力した接続文字列は、MultipleResultSets オプションが追加されている以外は、アプリケーションで使用する接続文字列と同じです。

Web.Production.config を開き、connectionStrings 要素を次の例のような connectionStrings 要素に置き換えます。 (connectionStrings 要素のみコピーし、コンテキストを示すために記載されている周囲のタグはコピーしないでください。)

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=vserver01.cytanium.com;Initial Catalog=contosouSchool;User Id=ContosoUniversityUser;Password=Password;MultipleActiveResultSets=True" 
         providerName="System.Data.SqlClient"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    <add name="SchoolContext" 
         connectionString="Data Source=vserver01.cytanium.com;Initial Catalog=contosouSchool;User Id=ContosoUniversityUser;Password=Password;MultipleActiveResultSets=True" 
         providerName="System.Data.SqlClient"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
  </connectionStrings>
  <!-- appSettings element, comments, and system.web element -->
</configuration>

Web.config ファイル内の接続文字列は必ず暗号化すべきだ、というアドバイスを目にすることがあります。 これは、自社ネットワーク内のサーバーにデプロイする場合には適しているかもしれません。 共有ホスティング環境にデプロイする場合は、ホスティング プロバイダーのセキュリティ対策を信頼することになるため、接続文字列を暗号化する必要性や実用性はありません。

運用環境へのデプロイ

これで、運用環境にデプロイする準備が整いました。 Web Deploy は、プロジェクトの App_Data フォルダーにある SQL Server Compact データベースを読み込み、含まれるすべてのテーブルとデータを、環境の SQL Server データベースに再作成します。 [Web のパッケージ化/公開] タブの設定を使って公開するには、運用環境用の新しい公開プロファイルを作成する必要があります。

まず、以前テスト プロファイルに対して実行した場合と同様に、既存の運用プロファイルを削除します。

ソリューション エクスプローラーで ContosoUniversity プロジェクトを右クリックし、[公開] をクリックします。

[プロファイル] タブを選択します。

[プロファイルの管理] をクリックします。

[運用] を選択し、[削除] をクリックして、[閉じる] をクリックします。

Web の公開ウィザードを 閉じ、この変更を保存します。

続いて、新しい運用プロファイルを作成し、それを使用してプロジェクトを公開します。

ソリューション エクスプローラーで ContosoUniversity プロジェクトを右クリックし、[公開] をクリックします。

[プロファイル] タブを選択します。

[インポート] をクリックし、先ほどダウンロードした .publishsettings ファイルを選択します。

[接続] タブで、[宛先 URL] を正しい一時的な URL に変更します。この例では、http://contosouniversity.com.vserver01.cytanium.com です。

プロファイルの名前を Production に変更します。 (そのためには、[プロファイル] タブを選択し、[プロファイルの管理] をクリックします。)

Web の公開ウィザードを閉じて、変更を保存します。

実際のアプリケーションで、運用環境のデータベースが更新されている場合、公開前に次の 2 つの手順を追加で実行します。

  1. 運用環境へのデプロイ」のチュートリアルに記載されている手順に従って、app_offline.htm をアップロードします。
  2. Cytanium コントロール パネルの ファイル マネージャー 機能を使用して、運用サイトから aspnet-Prod.sdf ファイルと School-Prod.sdf ファイルを ContosoUniversity プロジェクトの App_Data フォルダーにコピーします。 これにより、新しい SQL Server データベースにデプロイするデータには、運用 Web サイトで実行された最新の更新内容が確実に含まれるようになります。

[Web のワンクリック公開] ツールバーで、運用プロファイルが選択されていることを確認してから、[公開] をクリックします。

公開前に app_offline.htm をアップロードした場合、テストを実施する前に、Cytanium コントロール パネルが提供する ファイル マネージャー ユーティリティを使用して app_offline.htm を削除する必要があります。 App_Data フォルダー内の .sdf ファイルも併せて削除できます。

これでブラウザーで公開サイトの URL にアクセスし、テスト環境にデプロイしたときと同じ手順でアプリケーションのテストを実施できるようになりました。

開発環境での SQL Server Express LocalDB への切り替え

概要で説明したとおり、通常、開発環境ではテスト環境および運用環境と同じデータベース エンジンを使用することをお勧めします。 (開発環境で SQL Server Express を使うメリットは、開発環境、テスト環境、運用環境の間でデータベースの動作に違いが出ないという点であることを忘れないでください。)このセクションでは、Visual Studio 上でアプリケーションを実行する際に、ContosoUniversity プロジェクトが SQL Server Express LocalDB を使用するように設定します。

この移行を最もシンプルに実施するには、Code First およびメンバーシップ システムに、新しい開発用データベースを両方とも作成させるのが良いでしょう。 この方法で移行するには、次の 3 つの手順を実行する必要があります。

  1. 接続文字列を新しい SQL Server Express LocalDB データベースを指定するように変更します。
  2. Web サイト管理ツールを実行して管理者ユーザーを作成します。 これにより、メンバーシップ データベースが作成されます。
  3. Code First Migrations update-database コマンドを実行し、アプリケーションデータベースを作成して初期データを投入します。

Web.config ファイル内の接続文字列の更新

Web.config ファイルを開き、connectionStrings 要素を下記のコードに置き換えています。

<connectionStrings>
  <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-Dev.mdf;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
  <add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\School-Dev.mdf;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
</connectionStrings>

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

ソリューション エクスプローラーで ContosoUniversity プロジェクトを選択し、[プロジェクト] メニューから [ASP.NET 構成] をクリックします。

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

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

[セキュリティ] タブに戻ります。

[ユーザーの作成] をクリックし、[管理者] チェック ボックスをオンにして、admin という名前のユーザーを作成します。

Web サイト管理ツールを閉じます。

School データベースの作成

[パッケージ マネージャー コンソール] ウィンドウを開きます。

[既定のプロジェクト] ドロップダウン リストから、ContosoUniversity.DAL プロジェクトを選択します。

次のコマンドを入力します。

update-database

Code First Migrations により、データベースを作成する最初の移行が適用され、次に AddBirthDate 移行が適用された後、Seed メソッドが実行されます。

Control キーを押しながら F5 キーを押して、サイトを実行します。 テスト環境や運用環境に対して行ったように、[学生の追加] ページを開いて新しい学生を追加した後、[学生] ページを表示して、新規追加した学生が反映されていることを確認します。 これにより、School データベースが作成され初期化が行われたこと、そしてそのデータベースに対して読み書き両方のアクセス権を持っていることが検証できました。

[クレジットの更新] ページを選択してログインし、メンバーシップ データベースが正しくデプロイされていてアクセスできることを確認します。 ユーザー アカウントを移行していない場合は、管理者アカウントを作成し、[クレジットの更新] ページにアクセスして動作を確認します。

SQL Server Compact ファイルのクリーンアップ

SQL Server Compact のサポート用に含まれていたファイルおよび NuGet パッケージは、不要になりました。 必要に応じて (この手順は必須ではありません)、不要になったファイルや参照をクリーンアップできます。

ソリューション エクスプローラー で、App_Data フォルダーにある .sdf ファイルと、bin フォルダーにある amd64 フォルダーおよび x86 フォルダーを削除します。

ソリューション エクスプローラー で、ソリューション (個々のプロジェクトではなく) を右クリックし、[ソリューション用の NuGet パッケージの管理] をクリックします。

[NuGet パッケージの管理] ダイアログ ボックスの左側のペインで、[インストールされているパッケージ] を選択します。

EntityFramework.SqlServerCompact パッケージを選択し、[管理] をクリックします。

[プロジェクトの選択] ダイアログ ボックスで、両方のプロジェクトが選択された状態になっています。 両方のプロジェクトからパッケージをアンインストールするには、両方のチェック ボックスをオフにしてから、[OK] をクリックします。

依存パッケージもアンインストールするかどうかを確認するダイアログ ボックスが表示されたら、[いいえ] をクリックします。 これらのパッケージのうち、Entity Framework パッケージは保持しておく必要があります。

SqlServerCompact パッケージも、同様の手順でアンインストールします。 (EntityFramework.SqlServerCompact パッケージは SqlServerCompact パッケージに依存しているため、パッケージのアンインストールはこの順序で行う必要があります。)

これで、SQL Server Express とフル バージョンの SQL Server への移行作業が無事に完了しました。 次のチュートリアルでは、データベースに変更を加え、テスト環境と運用環境のデータベースが SQL Server Express とフルバージョンの SQL Server を使用している場合に、データベースの変更をデプロイする方法について説明します。