ASP.NET Identity: EntityFramework MySQL プロバイダーで MySQL ストレージを使用する (C#)
作成者: Maurycy Markowski、Raquel Soares De Almeida、Robert McMurray
このチュートリアルでは、EntityFramework (SQL クライアント プロバイダー) を使用した ASP.NET Identity の既定のデータ ストレージ メカニズムを MySQL プロバイダーに置き換える方法について説明します。
次のトピックについては、このチュートリアルで詳しく説明します。
- Azure での MySQL データベースの作成
- Visual Studio 2013 MVC テンプレートを使用した MVC アプリケーションの作成
- MySQL データベース プロバイダーと連携するように EntityFramework を構成する
- アプリケーションを実行して結果を確認する
このチュートリアルの最後には、Azure でホストされている MySQL データベースを使用する ASP.NET Identity ストアを含む MVC アプリケーションが用意されています。
Azure での MySQL データベース インスタンスの作成
Azure Portal にログインします。
ページの下部にある [新規] を選択し、[ストア] を選択します。
[アドオンの選択] ウィザードで、ClearDB MySQL データベースを選択し、フレームの下部にある [次へ] 矢印をクリックします。
既定の Free プランのままにし、NAME を IdentityMySQLDatabase に変更し、最も近いリージョンを選択して、フレームの下部にある [次へ] 矢印をクリックします。
PURCHASE チェックマークをクリックして、データベースの作成を完了します。
データベースが作成されたら、管理ポータルの [アドオン] タブから管理できます。 データベースの接続情報を取得するには、ページの下部にある CONNECTION INFO をクリックします。
CONNECTIONSTRING フィールドのコピー ボタンをクリックして接続文字列をコピーして保存します。この情報は、MVC アプリケーションのこのチュートリアルの後半で使用します。
MVC アプリケーション プロジェクトの作成
チュートリアルのこのセクションの手順を完了するには、まず Visual Studio Express 2013 for Web または Visual Studio 2013 をインストールする必要があります。 Visual Studio がインストールされたら、次の手順に従って新しい MVC アプリケーション プロジェクトを作成します。
Visual Studio 2013 を開きます。
[スタート] ページで [新しいプロジェクト] をクリックするか、[ファイル] メニューをクリックし、[新しいプロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されたら、テンプレートの一覧で [Visual C#] を展開し、[Web] をクリックし、[ASP.NET Web アプリケーション] を選択します。 プロジェクトに IdentityMySQLDemo という名前を付け、[OK] を選択します。
[新しい ASP.NET プロジェクト] ダイアログで、既定のオプションを使用して MVC テンプレートを選択します。これにより、認証方法として個々のユーザー アカウントが構成されます。 [OK] をクリックします。
MySQL データベースと連携するように EntityFramework を構成する
プロジェクトの Entity Framework アセンブリを更新する
Visual Studio 2013 テンプレートから作成された MVC アプリケーションには EntityFramework 6.0.0 パッケージへの参照が含まれていますが、リリース以降、そのアセンブリに対する更新プログラムがあり、パフォーマンスが大幅に向上しています。 アプリケーションでこれらの最新の更新プログラムを使用するには、次の手順を使用します。
Visual Studio で MVC プロジェクトを開きます。
[ツール] をクリックし、[NuGet パッケージ マネージャー] をクリックして、[パッケージ マネージャー コンソール] をクリックします。
パッケージ マネージャー コンソールが Visual Studio の下部セクションに表示されます。 「Update-Package EntityFramework」と入力し、Enter キーを押します。
EntityFramework 用の MySQL プロバイダーをインストールする
EntityFramework が MySQL データベースに接続するには、MySQL プロバイダーをインストールする必要があります。 これを行うには、パッケージ マネージャー コンソールを開き、「Install-Package MySql.Data.Entity -Pre」と入力し、Enter キーを押します。
Note
これはアセンブリのプレリリース バージョンであり、バグが含まれている可能性があります。 運用環境では、プロバイダーのプレリリース バージョンを使用しないでください。
[次の画像をクリックして展開します。]
アプリケーションの Web.config ファイルにプロジェクト構成を変更する
このセクションでは、インストールした MySQL プロバイダーを使用するように Entity Framework を構成し、MySQL プロバイダー ファクトリを登録して、Azure から接続文字列を追加します。
Note
次の例には、MySql.Data.dll の特定のアセンブリ バージョンが含まれています。 アセンブリ バージョンが変更された場合は、適切なバージョンで適切な構成設定を変更する必要があります。
Visual Studio 2013 でプロジェクトの Web.config ファイルを開きます。
Entity Framework の既定のデータベース プロバイダーとファクトリを定義する次の構成設定を見つけます。
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>
これらの構成設定を次のように置き換えます。この構成により、MySQL プロバイダーを使用するように Entity Framework が構成されます。
<entityFramework> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity"/> </providers> </entityFramework> <system.data> <DbProviderFactories> <remove invariant="MySql.Data.MySqlClient"></remove> <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.7.2.0"/> </DbProviderFactories> </system.data>
<connectionStrings> セクションを見つけて、次のコードに置き換えます。これは、Azure でホストされている MySQL データベースの接続文字列を定義します (providerName の値も元の値から変更されていることに注意してください)。
<connectionStrings> <add name="DefaultConnection" providerName="MySql.Data.MySqlClient" connectionString="[Insert your ConnectionString from Azure here]"/> </connectionStrings>
カスタム MigrationHistory コンテキストの追加
Entity Framework Code First では、MigrationHistory テーブルを使用してモデルの変更を追跡し、データベース スキーマと概念スキーマの整合性を確保します。 ただし、このテーブルは、主キーが大きすぎるため、既定では MySQL では機能しません。 この状況を解決するには、そのテーブルのキー サイズを縮小する必要があります。 そのためには、次の手順を行ってください。
このテーブルのスキーマ情報は HistoryContext にキャプチャされ、他の DbContext として変更できます。 これを行うには、MySqlHistoryContext.cs という名前の新しいクラス ファイルをプロジェクトに追加し、その内容を次のコードに置き換えます。
using System.Data.Common; using System.Data.Entity; using System.Data.Entity.Migrations.History; namespace IdentityMySQLDemo { public class MySqlHistoryContext : HistoryContext { public MySqlHistoryContext( DbConnection existingConnection, string defaultSchema) : base(existingConnection, defaultSchema) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired(); modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired(); } } }
次に、既定ではなく、変更された HistoryContext を使用するように Entity Framework を構成する必要があります。 これを行うには、コードベースの構成機能を利用します。 これを行うには、MySqlConfiguration.cs という名前の新しいクラス ファイルをプロジェクトに追加し、その内容を次のように置き換えます。
using System.Data.Entity; namespace IdentityMySQLDemo { public class MySqlConfiguration : DbConfiguration { public MySqlConfiguration() { SetHistoryContext( "MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); } } }
ApplicationDbContext のカスタム EntityFramework 初期化子の作成
このチュートリアルで取り上げられる MySQL プロバイダーは現在 Entity Framework の移行をサポートしていないため、データベースに接続するにはモデル初期化子を使用する必要があります。 このチュートリアルでは Azure 上の MySQL インスタンスを使用しているため、カスタム Entity Framework 初期化子を作成する必要があります。
Note
この手順は、Azure 上の SQL Server インスタンスに接続している場合や、オンプレミスでホストされているデータベースを使用している場合は必要ありません。
MySQL 用のカスタム Entity Framework 初期化子を作成するには、次の手順に従います。
MySqlInitializer.cs という名前の新しいクラス ファイルをプロジェクトに追加し、その内容を次のコードに置き換えます。
using IdentityMySQLDemo.Models; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Linq; namespace IdentityMySQLDemo { public class MySqlInitializer : IDatabaseInitializer<ApplicationDbContext> { public void InitializeDatabase(ApplicationDbContext context) { if (!context.Database.Exists()) { // if database did not exist before - create it context.Database.Create(); } else { // query to check if MigrationHistory table is present in the database var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>( "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'IdentityMySQLDatabase' AND table_name = '__MigrationHistory'"); // if MigrationHistory table is not there (which is the case first time we run) - create it if (migrationHistoryTableExists.FirstOrDefault() == 0) { context.Database.Delete(); context.Database.Create(); } } } } }
Models ディレクトリにあるプロジェクトの IdentityModels.cs ファイルを開き、その内容を次のように置き換えます。
using Microsoft.AspNet.Identity.EntityFramework; using System.Data.Entity; namespace IdentityMySQLDemo.Models { // You can add profile data for the user by adding more properties to your ApplicationUser // class, please visit https://go.microsoft.com/fwlink/?LinkID=317594 to learn more. public class ApplicationUser : IdentityUser { } public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { static ApplicationDbContext() { Database.SetInitializer(new MySqlInitializer()); } public ApplicationDbContext() : base("DefaultConnection") { } } }
アプリケーションの実行とデータベースの確認
前のセクションの手順を完了したら、データベースをテストする必要があります。 そのためには、次の手順を行ってください。
Ctrl + F5 キーを押して Web アプリケーションをビルドし、実行します。
ページの上部にある [登録] タブをクリックします。
新しいユーザー名とパスワードを入力し、[登録] をクリックします。
この時点で、ASP.NET Identity テーブルが MySQL データベースに作成され、ユーザーが登録され、アプリケーションにログインします。
MySQL Workbench ツールをインストールしてデータを確認する
MySQL ダウンロード ページから MySQL Workbench ツールをインストールする
インストール ウィザードの [機能の選択] タブで、[アプリケーション] セクションの [MySQL Workbench] を選択します。
アプリを起動し、このチュートリアルの冒頭で作成した Azure MySQL データベースの接続文字列 データを使用して新しい接続を追加します。
接続を確立したら、IdentityMySQLDatabase で作成された ASP.NET Identity テーブルを調べます。
次の図に示すように、ASP.NET Identity が必要なすべてのテーブルが作成されていることがわかります。
新しいユーザーを登録するときに、エントリをチェックする aspnetusers テーブルを調べます。