ASP.NET Identity: EntityFramework MySQL プロバイダーで MySQL ストレージを使用する (C#)

作成者: Maurycy MarkowskiRaquel Soares De AlmeidaRobert McMurray

このチュートリアルでは、EntityFramework (SQL クライアント プロバイダー) を使用した ASP.NET Identity の既定のデータ ストレージ メカニズムを MySQL プロバイダーに置き換える方法について説明します。

次のトピックについては、このチュートリアルで詳しく説明します。

  • Azure での MySQL データベースの作成
  • Visual Studio 2013 MVC テンプレートを使用した MVC アプリケーションの作成
  • MySQL データベース プロバイダーと連携するように EntityFramework を構成する
  • アプリケーションを実行して結果を確認する

このチュートリアルの最後には、Azure でホストされている MySQL データベースを使用する ASP.NET Identity ストアを含む MVC アプリケーションが用意されています。

Azure での MySQL データベース インスタンスの作成

  1. Azure Portal にログインします。

  2. ページの下部にある [新規] を選択し、[ストア] を選択します。

    Screenshot of the Azure Portal menu with the Store menu item highlighted at bottom and outlined with a red rectangle.

  3. [アドオンの選択] ウィザードで、ClearDB MySQL データベースを選択し、フレームの下部にある [次へ] 矢印をクリックします。

    [次の画像をクリックして展開します。 ] Screenshot of the Choose an Add-on wizard, with Clear D B My S Q L Database highlighted with a red rectangle.

  4. 既定の Free プランのままにし、NAMEIdentityMySQLDatabase に変更し、最も近いリージョンを選択して、フレームの下部にある [次へ] 矢印をクリックします。

    [次の画像をクリックして展開します。 ] Screenshot of the Personalize Add-on dialog showing the Free plan option and the Name and region fields selected and highlighted with a red rectangle.

  5. PURCHASE チェックマークをクリックして、データベースの作成を完了します。

    [次の画像をクリックして展開します。 ] Screenshot of the Review Purchase dialog showing the Purchase button highlighted with a red rectangle.

  6. データベースが作成されたら、管理ポータルの [アドオン] タブから管理できます。 データベースの接続情報を取得するには、ページの下部にある CONNECTION INFO をクリックします。

    [次の画像をクリックして展開します。 ] Screenshot of the management portal with the Add Ons tab, the Identify My S Q L database item, and the Connection Info button highlighted in red.

  7. CONNECTIONSTRING フィールドのコピー ボタンをクリックして接続文字列をコピーして保存します。この情報は、MVC アプリケーションのこのチュートリアルの後半で使用します。

    [次の画像をクリックして展開します。 ] Screenshot of Connection info dialog with copy button highlighted at right of Connection String field.

MVC アプリケーション プロジェクトの作成

チュートリアルのこのセクションの手順を完了するには、まず Visual Studio Express 2013 for Web または Visual Studio 2013 をインストールする必要があります。 Visual Studio がインストールされたら、次の手順に従って新しい MVC アプリケーション プロジェクトを作成します。

  1. Visual Studio 2013 を開きます。

  2. [スタート] ページで [新しいプロジェクト] をクリックするか、[ファイル] メニューをクリックし、[新しいプロジェクト] をクリックします。

    [次の画像をクリックして展開します。 ] Screenshot of the Visual Studio start page showing the New Project option highlighted with a red rectangle.

  3. [新しいプロジェクト] ダイアログ ボックスが表示されたら、テンプレートの一覧で [Visual C#] を展開し、[Web] をクリックし、[ASP.NET Web アプリケーション] を選択します。 プロジェクトに IdentityMySQLDemo という名前を付け、[OK] を選択します。

    [次の画像をクリックして展開します。 ] Screenshot of New Project dialog box, with Visual C hash mark expanded at left and Web highlighted. ASP dot NET Web Application selected at right with project name Identity My S Q L Demo in name field at bottom.

  4. [新しい ASP.NET プロジェクト] ダイアログで、既定のオプションを使用して MVC テンプレートを選択します。これにより、認証方法として個々のユーザー アカウントが構成されます。 [OK] をクリックします。

    [次の画像をクリックして展開します。 ] Screenshot of New A S P dot NET Project dialog, with M V C template selected and default options checked.

MySQL データベースと連携するように EntityFramework を構成する

プロジェクトの Entity Framework アセンブリを更新する

Visual Studio 2013 テンプレートから作成された MVC アプリケーションには EntityFramework 6.0.0 パッケージへの参照が含まれていますが、リリース以降、そのアセンブリに対する更新プログラムがあり、パフォーマンスが大幅に向上しています。 アプリケーションでこれらの最新の更新プログラムを使用するには、次の手順を使用します。

  1. Visual Studio で MVC プロジェクトを開きます。

  2. [ツール] をクリックし、[NuGet パッケージ マネージャー] をクリックして、[パッケージ マネージャー コンソール] をクリックします。

    [次の画像をクリックして展開します。 ] Screenshot of M V C project in Visual Studio, with Tools selected in top menu, Library Package Manager selected at left and Package Manager Console selected at right.

  3. パッケージ マネージャー コンソールが Visual Studio の下部セクションに表示されます。 「Update-Package EntityFramework」と入力し、Enter キーを押します。

    [次の画像をクリックして展開します。 ] Screenshot of Package Manager Console in bottom section of Visual Studio, with Update Package Entity Framework instruction displayed on command line.

EntityFramework 用の MySQL プロバイダーをインストールする

EntityFramework が MySQL データベースに接続するには、MySQL プロバイダーをインストールする必要があります。 これを行うには、パッケージ マネージャー コンソールを開き、「Install-Package MySql.Data.Entity -Pre」と入力し、Enter キーを押します。

Note

これはアセンブリのプレリリース バージョンであり、バグが含まれている可能性があります。 運用環境では、プロバイダーのプレリリース バージョンを使用しないでください。

[次の画像をクリックして展開します。]

Screenshot of Package Manager Console in bottom section of Visual Studio, with Install-Package My S q l dot Data dot Entity dash Pre instruction displayed on command line.

アプリケーションの Web.config ファイルにプロジェクト構成を変更する

このセクションでは、インストールした MySQL プロバイダーを使用するように Entity Framework を構成し、MySQL プロバイダー ファクトリを登録して、Azure から接続文字列を追加します。

Note

次の例には、MySql.Data.dll の特定のアセンブリ バージョンが含まれています。 アセンブリ バージョンが変更された場合は、適切なバージョンで適切な構成設定を変更する必要があります。

  1. Visual Studio 2013 でプロジェクトの Web.config ファイルを開きます。

  2. 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>
    
  3. これらの構成設定を次のように置き換えます。この構成により、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>
    
  4. <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 では機能しません。 この状況を解決するには、そのテーブルのキー サイズを縮小する必要があります。 そのためには、次の手順を行ってください。

  1. このテーブルのスキーマ情報は 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();
        }
      }
    }
    
  2. 次に、既定ではなく、変更された 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 初期化子を作成するには、次の手順に従います。

  1. 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();
            }
          }
        }
      }
    }
    
  2. 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")
        {
        }
      }
    }
    

アプリケーションの実行とデータベースの確認

前のセクションの手順を完了したら、データベースをテストする必要があります。 そのためには、次の手順を行ってください。

  1. Ctrl + F5 キーを押して Web アプリケーションをビルドし、実行します。

  2. ページの上部にある [登録] タブをクリックします。

    [次の画像をクリックして展開します。 ] Screenshot of A S P dot NET website, with Register tab highlighted in menu at upper right.

  3. 新しいユーザー名とパスワードを入力し、[登録] をクリックします。

    [次の画像をクリックして展開します。 ] Screenshot of A S P dot NET registration dialog, with user name, password, and confirm password fields completed and Register button highlighted below.

  4. この時点で、ASP.NET Identity テーブルが MySQL データベースに作成され、ユーザーが登録され、アプリケーションにログインします。

    [次の画像をクリックして展開します。 ] Screenshot of A S P dot NET website after user has completed registration. Tab with Hello greeting, followed by username, is highlighted in menu at upper right.

MySQL Workbench ツールをインストールしてデータを確認する

  1. MySQL ダウンロード ページから MySQL Workbench ツールをインストールする

  2. インストール ウィザードの [機能の選択] タブで、[アプリケーション] セクションの [MySQL Workbench] を選択します。

  3. アプリを起動し、このチュートリアルの冒頭で作成した Azure MySQL データベースの接続文字列 データを使用して新しい接続を追加します。

  4. 接続を確立したら、IdentityMySQLDatabase で作成された ASP.NET Identity テーブルを調べます。

  5. 次の図に示すように、ASP.NET Identity が必要なすべてのテーブルが作成されていることがわかります。

    [次の画像をクリックして展開します。 ] Screenshot of My S Q L Workbench tool dialog. A S P dot NET Identity tables created on the Identity My S Q L Database are highlighted at lower left.

  6. 新しいユーザーを登録するときに、エントリをチェックする aspnetusers テーブルを調べます。

    [次の画像をクリックして展開します。 ] Screenshot of a s p net users table, with entries displaying I D, User Name, Password Hash, Security Stamp, and Discriminator columns.