次の方法で共有


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

作成者 : Maurycy MarkowskiRaquel Soares De AlmeidaRobert McMurray

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

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

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

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

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

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

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

    [ストア] メニュー項目が下部で強調表示され、赤い四角形で囲まれた Azure Portal メニューのスクリーンショット。

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

    [次の画像をクリックして展開します。 ] [ アドオンの選択] ウィザードのスクリーンショット。Clear D B My S Q L Database が赤い四角形で強調表示されています。

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

    [次の画像をクリックして展開します。 ] [アドオンのカスタマイズ] ダイアログのスクリーンショット。Free プラン オプションと、[名前] フィールドと [領域] フィールドが選択され、赤い四角形で強調表示されています。

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

    [次の画像をクリックして展開します。 ] 赤い四角形で強調表示された [購入の確認] ボタンを示す [購入の確認] ダイアログのスクリーンショット。

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

    [次の画像をクリックして展開します。 ] 管理ポータルのスクリーンショット。[アドオン] タブ、[個人用 Q L データベースの識別] 項目、および [接続情報] ボタンが赤で強調表示されています。

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

    [次の画像をクリックして展開します。 ] [ 接続文字列] フィールドの右側で [コピー] ボタンが強調表示されている [接続情報] ダイアログのスクリーンショット。

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

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

  1. Visual Studio 2103 を開きます。

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

    [次の画像をクリックして展開します。 ] [新しいプロジェクト] オプションが赤い四角形で強調表示されている Visual Studio のスタート ページのスクリーンショット。

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

    [次の画像をクリックして展開します。 ] [新しいプロジェクト] ダイアログ ボックスのスクリーンショット。Visual C ハッシュ マークが左に展開され、Web が強調表示されています。ASP dot NET Web Application が右側で選択され、プロジェクト名 Identity My S Q L Demo が名前フィールドの下部に表示されます。

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

    [次の画像をクリックして展開します。 ] [新しい A S P ドット NET プロジェクト] ダイアログのスクリーンショット。M V C テンプレートが選択され、既定のオプションがオンになっています。

MySQL データベースを操作するように EntityFramework を構成する

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

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

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

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

    [次の画像をクリックして展開します。 ] Visual Studio の M V C プロジェクトのスクリーンショット。上部のメニューで [ツール] が選択され、左側で [ライブラリ パッケージ マネージャー] が選択され、右側で [パッケージ マネージャー コンソール] が選択されています。

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

    [次の画像をクリックして展開します。 ] Visual Studio の下部セクションにあるパッケージ マネージャー コンソールのスクリーンショット。コマンド ラインに [パッケージ エンティティ フレームワークの更新] 命令が表示されています。

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

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

注意

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

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

Visual Studio の下部セクションにあるパッケージ マネージャー コンソールのスクリーンショット。コマンド ラインに [My S q l dot Data dot Entity dash Pre instruction]\(My S q l dot Data dot Entity dash Pre 命令\) が表示されているInstall-Package。

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

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

注意

次の例には、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. ページの上部にある [ 登録 ] タブをクリックします。

    [次の画像をクリックして展開します。 ] 右上のメニューで [登録] タブが強調表示されている S P ドット NET Web サイトのスクリーンショット。

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

    [次の画像をクリックして展開します。 ] S P ドット NET 登録ダイアログのスクリーンショット。ユーザー名、パスワード、パスワード フィールドが完了したことを確認し、下の [登録] ボタンが強調表示されています。

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

    [次の画像をクリックして展開します。 ] ユーザーが登録を完了した後の S P ドット NET Web サイトのスクリーンショット。右上のメニューで、Hello greeting の後にユーザー名が続くタブが強調表示されています。

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

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

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

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

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

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

    [次の画像をクリックして展開します。 ] [My S Q L Workbench ツール] ダイアログのスクリーンショット。ID My S Q L データベースで作成された S P ドット NET ID テーブルが左下で強調表示されています。

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

    [次の画像をクリックして展開します。 ] p net users テーブルのスクリーンショット。エントリに ID、ユーザー名、パスワード ハッシュ、セキュリティ スタンプ、識別子の各列が表示されています。