ASP.NET Identity:EntityFramework MySQL プロバイダーで MySQL ストレージを使用する (C#)
作成者 : Maurycy Markowski、 Raquel Soares De Almeida、 Robert McMurray
このチュートリアルでは、 ASP.NET Identity の既定のデータ ストレージ メカニズムを EntityFramework (SQL クライアント プロバイダー) と MySQL プロバイダーに置き換える方法について説明します。
このチュートリアルでは、次のトピックについて説明します。
- Azure での MySQL データベースの作成
- VISUAL STUDIO 2013 MVC テンプレートを使用した MVC アプリケーションの作成
- MySQL データベース プロバイダーと連携するように EntityFramework を構成する
- アプリケーションを実行して結果を確認する
このチュートリアルの最後には、Azure でホストされている MySQL データベースを使用している ASP.NET Identity ストアを含む MVC アプリケーションが用意されています。
Azure での MySQL データベース インスタンスの作成
Azure Portal にログインします。
ページの下部にある [ 新規 ] をクリックし、[ ストア] を選択します。
[ アドオンの選択 ] ウィザードで[ ClearDB MySQL Database]\(ClearDB MySQL データベース\) を選択し、フレームの下部にある [次へ ] 矢印をクリックします。
既定の Free プランをそのまま使用し、[ 名前] を [IdentityMySQLDatabase] に変更し、最も近いリージョンを選択し、フレームの下部にある [次へ ] 矢印をクリックします。
[ 購入 ] チェック マークをクリックして、データベースの作成を完了します。
データベースが作成されたら、管理ポータルの [アドオン] タブから管理できます。 データベースの接続情報を取得するには、ページの下部にある [接続情報 ] をクリックします。
CONNECTIONSTRING フィールドのコピー ボタンをクリックして接続文字列をコピーし、保存します。この情報は、このチュートリアルの後半で MVC アプリケーションに使用します。
MVC アプリケーション プロジェクトの作成
チュートリアルのこのセクションの手順を完了するには、まず 2013 for Web または Visual Studio 2013 Visual Studio Expressインストールする必要があります。 Visual Studio がインストールされたら、次の手順に従って新しい MVC アプリケーション プロジェクトを作成します。
Visual Studio 2103 を開きます。
[スタート] ページで [新しいプロジェクト] をクリックするか、[ファイル] メニューの [新しいプロジェクト] をクリックします。
[ 新しいプロジェクト ] ダイアログ ボックスが表示されたら、テンプレートの一覧で [Visual C# ] を展開し、[ Web] をクリックし、[ Web アプリケーション ASP.NET 選択します。 プロジェクトに 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 キーを押します。
注意
これはアセンブリのプレリリース バージョンであり、バグが含まれている可能性があります。 運用環境では、プロバイダーのプレリリース バージョンを使用しないでください。
[次の画像をクリックして展開します。]
アプリケーションのWeb.config ファイルにプロジェクト構成を変更する
このセクションでは、インストールした MySQL プロバイダーを使用するように Entity Framework を構成し、MySQL プロバイダー ファクトリを登録し、Azure から接続文字列を追加します。
注意
次の例には、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 ID テーブルが MySQL データベースに作成され、ユーザーが登録され、アプリケーションにログインします。
MySQL Workbench ツールをインストールしてデータを確認する
MySQL のダウンロード ページから MySQL Workbench ツールをインストールする
インストール ウィザードの [機能の選択] タブで、[アプリケーション] セクションの [MySQL Workbench] を選択します。
アプリを起動し、このチュートリアルの冒頭で作成した Azure MySQL データベースの接続文字列データを使用して新しい接続を追加します。
接続を確立したら、IdentityMySQLDatabase で作成された ASP.NET ID テーブルを調べます。
次の図に示すように、ASP.NET ID が必要なすべてのテーブルが作成されていることがわかります。
たとえば、aspnetusers テーブルを調べて、新しいユーザーを登録するときにエントリをチェックします。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示