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 應用程式
- 設定 EntityFramework 以使用 MySQL 資料庫提供者
- 執行應用程式以確認結果
在本教學課程結束時,您將擁有 MVC 應用程式,其中包含使用裝載于 Azure 中的 MySQL 資料庫的 ASP.NET 身分識別存放區。
在 Azure 上建立 MySQL 資料庫實例
登入 Azure 入口網站。
按一下頁面底部的 [ 新增 ],然後選取 [ STORE]:
在 [ 選擇附加元件 精靈] 中,選取 [ClearDB MySQL 資料庫],然後按一下框架底部的 [ 下一步 ] 箭號:
保留預設 的 [免費 方案],將 [名稱 ] 變更為 [IdentityMySQLDatabase],選取最接近您的區域,然後按一下畫面底部的 [ 下一步 ] 箭號:
按一下 [購買 ] 核取記號以完成資料庫建立。
建立資料庫之後,您可以從管理入口網站的 [附加元件] 索引標籤加以管理。 若要擷取資料庫的連線資訊,請按一下頁面底部的 [ 連線資訊 ]:
按一下 CONNECTIONSTRING 欄位的 [複製] 按鈕並加以儲存,以複製連接字串;您稍後將在本教學課程中針對 MVC 應用程式使用這項資訊:
建立 MVC 應用程式專案
若要完成本教學課程本節中的步驟,您必須先安裝Visual Studio Express 2013 for Web或Visual Studio 2013。 安裝 Visual Studio 之後,請使用下列步驟來建立新的 MVC 應用程式專案:
開啟 Visual Studio 2103。
從 [開始] 頁面按一下 [新增專案],或者按一下 [檔案] 功能表,然後按一下 [新增專案]:
顯示 [ 新增專案 ] 對話方塊時,展開範本清單中的 [Visual C# ],然後按一下 [ Web],然後選取 [ASP.NET Web 應用程式]。 將專案命名為 IdentityMySQLDemo ,然後按一下 [ 確定]:
在 [ 新增 ASP.NET 專案 ] 對話方塊中,選取 MVC 範本並選取預設選項;這會將 個別使用者帳戶 設定為驗證方法。 按一下 [確定]:
設定 EntityFramework 以使用 MySQL 資料庫
更新專案的 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。
注意
這是元件的發行前版本,因此可能包含 Bug。 您不應該在生產環境中使用提供者的發行前版本。
[按一下下圖以展開它。]
對應用程式的Web.config檔案進行專案組態變更
在本節中,您會將 Entity Framework 設定為使用您剛才安裝的 MySQL 提供者、註冊 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>
將這些組態設定取代為下列專案,其會將 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>
<找出 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(); } } }
接下來,您必須將 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 初始化運算式,請使用下列步驟:
將名為 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 應用程式。
按一下頁面頂端的 [ 註冊] 索引 標籤:
輸入新的使用者名稱和密碼,然後按一下 [ 註冊]:
此時會在 MySQL 資料庫上建立 ASP.NET 身分識別資料表,而且使用者已註冊並登入應用程式:
安裝 MySQL Workbench 工具來驗證資料
從MySQL 下載頁面安裝MySQL Workbench工具
在安裝精靈:[功能選取]索引標籤中,選取[應用程式] 區段下的[MySQL Workbench]。
啟動應用程式,並使用您在本教學課程開頭所建立之 Azure MySQL 資料庫的連接字串資料來新增連線。
建立連線之後,請檢查在IdentityMySQLDatabase上建立的 ASP.NET身分識別資料表。
您會看到所有 ASP.NET 身分識別必要資料表都會建立,如下圖所示:
檢查 aspnetusers 資料表是否有實例,以在您註冊新使用者時檢查項目。