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 應用程式
  • 設定 EntityFramework 以使用 MySQL 資料庫提供者
  • 執行應用程式以確認結果

在本教學課程結束時,您將擁有 MVC 應用程式,其中包含使用裝載于 Azure 中的 MySQL 資料庫的 ASP.NET 身分識別存放區。

在 Azure 上建立 MySQL 資料庫實例

  1. 登入 Azure 入口網站

  2. 按一下頁面底部的 [ 新增 ],然後選取 [ STORE]:

    Azure 入口網站功能表的螢幕擷取畫面,其中已醒目提示底部的 [市集] 功能表項目,並以紅色矩形大綱顯示。

  3. 在 [ 選擇附加元件 精靈] 中,選取 [ClearDB MySQL 資料庫],然後按一下框架底部的 [ 下一步 ] 箭號:

    [按一下下圖以展開它。 ] [選擇附加元件精靈] 的螢幕擷取畫面,其中已醒目提示紅色矩形的 Clear D B My S Q L Database。

  4. 保留預設 的 [免費 方案],將 [名稱 ] 變更為 [IdentityMySQLDatabase],選取最接近您的區域,然後按一下畫面底部的 [ 下一步 ] 箭號:

    [按一下下圖以展開它。 ] 個人化附加元件對話方塊的螢幕擷取畫面,其中顯示 [免費方案] 選項,以及選取並醒目提示紅色矩形的 [名稱及區域] 欄位。

  5. 按一下 [購買 ] 核取記號以完成資料庫建立。

    [按一下下圖以展開它。 ] [檢閱購買] 對話方塊的螢幕擷取畫面,其中顯示醒目提示紅色矩形的 [購買] 按鈕。

  6. 建立資料庫之後,您可以從管理入口網站的 [附加元件] 索引標籤加以管理。 若要擷取資料庫的連線資訊,請按一下頁面底部的 [ 連線資訊 ]:

    [按一下下圖以展開它。 ] 管理入口網站的螢幕擷取畫面,其中 [附加元件] 索引標籤、[識別我的 S Q L 資料庫專案],以及醒目提示紅色的 [連線資訊] 按鈕。

  7. 按一下 CONNECTIONSTRING 欄位的 [複製] 按鈕並加以儲存,以複製連接字串;您稍後將在本教學課程中針對 MVC 應用程式使用這項資訊:

    [按一下下圖以展開它。 ] [連線資訊] 對話方塊的螢幕擷取畫面,其中已醒目提示 [連接字串] 欄位右側的 [複製] 按鈕。

建立 MVC 應用程式專案

若要完成本教學課程本節中的步驟,您必須先安裝Visual Studio Express 2013 for WebVisual Studio 2013。 安裝 Visual Studio 之後,請使用下列步驟來建立新的 MVC 應用程式專案:

  1. 開啟 Visual Studio 2103。

  2. 從 [開始] 頁面按一下 [新增專案],或者按一下 [檔案] 功能表,然後按一下 [新增專案]:

    [按一下下圖以展開它。 ] Visual Studio 起始頁的螢幕擷取畫面,其中顯示醒目提示紅色矩形的 [新增專案] 選項。

  3. 顯示 [ 新增專案 ] 對話方塊時,展開範本清單中的 [Visual C# ],然後按一下 [ Web],然後選取 [ASP.NET Web 應用程式]。 將專案命名為 IdentityMySQLDemo ,然後按一下 [ 確定]:

    [按一下下圖以展開它。 ] [新增專案] 對話方塊的螢幕擷取畫面,其中 Visual C 雜湊標記會在左側展開,並醒目提示 Web。在底部的名稱欄位中選取的 ASP 點 NET Web 應用程式,其專案名稱為 Identity My S Q L Demo。

  4. 在 [ 新增 ASP.NET 專案 ] 對話方塊中,選取 MVC 範本並選取預設選項;這會將 個別使用者帳戶 設定為驗證方法。 按一下 [確定]:

    [按一下下圖以展開它。 ] [新增 S P 點 NET 專案] 對話方塊的螢幕擷取畫面,其中已選取 M V C 範本,並已核取預設選項。

設定 EntityFramework 以使用 MySQL 資料庫

更新專案的 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 底部區段的 [套件管理員主控台] 螢幕擷取畫面,其中顯示命令列上顯示的更新套件 Entity Framework 指令。

安裝 EntityFramework 的 MySQL 提供者

若要讓 EntityFramework 連線到 MySQL 資料庫,您必須安裝 MySQL 提供者。 若要這樣做,請開啟 套件管理員主控台 ,然後輸入 「Install-Package MySql.Data.Entity -Pre」,然後按 Enter。

注意

這是元件的發行前版本,因此可能包含 Bug。 您不應該在生產環境中使用提供者的發行前版本。

[按一下下圖以展開它。]

Visual Studio 底部區段的套件管理員主控台螢幕擷取畫面,其中Install-Package [我的 S q l 點資料點實體虛線] 命令列上顯示的指示。

對應用程式的Web.config檔案進行專案組態變更

在本節中,您會將 Entity Framework 設定為使用您剛才安裝的 MySQL 提供者、註冊 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. 將這些組態設定取代為下列專案,其會將 Entity Framework 設定為使用 MySQL 提供者:

    <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. 接下來,您必須將 Entity Framework 設定為使用修改過的 HistoryCoNtext,而不是預設的 HistoryCoNtext。 這可藉由利用程式碼型組態功能來完成。 若要這樣做,請將名為 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 初始化運算式。

注意

如果您要連線到 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 網站的螢幕擷取畫面,其中右上方功能表中已醒目提示 [註冊] 索引標籤。

  3. 輸入新的使用者名稱和密碼,然後按一下 [ 註冊]:

    [按一下下列影像加以展開。 ] S P 點 NET 註冊對話方塊的螢幕擷取畫面,其中使用者名稱、密碼和確認密碼欄位已完成,並醒目提示下方的 [註冊] 按鈕。

  4. 此時會在 MySQL 資料庫上建立 ASP.NET 身分識別資料表,而且使用者已註冊並登入應用程式:

    [按一下下列影像加以展開。 ] 使用者完成註冊之後的 S P 點 NET 網站的螢幕擷取畫面。具有 Hello 問候語的索引標籤,後面接著使用者名稱,會在右上方的功能表中反白顯示。

安裝 MySQL Workbench 工具來驗證資料

  1. MySQL 下載頁面安裝MySQL Workbench工具

  2. 在安裝精靈:[功能選取]索引標籤中,選取[應用程式] 區段下的[MySQL Workbench]。

  3. 啟動應用程式,並使用您在本教學課程開頭所建立之 Azure MySQL 資料庫的連接字串資料來新增連線。

  4. 建立連線之後,請檢查在IdentityMySQLDatabase上建立的 ASP.NET身分識別資料表。

  5. 您會看到所有 ASP.NET 身分識別必要資料表都會建立,如下圖所示:

    [按一下下列影像加以展開。 ] [我的 S Q L Workbench 工具] 對話方塊的螢幕擷取畫面。在識別我的 S Q L 資料庫上建立的 S P 點 NET 身分識別資料表會反白顯示于左下方。

  6. 檢查 aspnetusers 資料表是否有實例,以在您註冊新使用者時檢查項目。

    [按一下下列影像加以展開。 ] p net users 資料表的螢幕擷取畫面,其中包含顯示識別碼、使用者名稱、密碼雜湊、安全性戳記和鑒別子資料行的專案。