使用ABP EntityFramework連線MySQL資料庫

深藍發表於2016-09-07
ASP.NET Boilerplate(簡稱ABP)是在.Net平臺下一個很流行的DDD框架,該框架已經為我們提供了大量的函式,非常方便與搭建企業應用。

關於這個框架的介紹我就不多說,有興趣的可以參見官方文件:http://www.aspnetboilerplate.com/Pages/Documents

使用ABP+EF+SQL Server是比較推薦的組合,但是既然我們使用的是EF,那麼就應該是和資料庫分離的,也就意味著我們應該可以採用其他的資料庫,比如MySQL。

ABP初始化的專案模板還提供了Module Zero專案,為我們提供了使用者、角色、許可權等等通用功能,但是在使用初始化的模板連線MySQL卻會報錯,無法執行,下面我來解決ABP+MySQL的問題。這是操作步驟:

1.從官方網站下載ABP專案模板,並解壓到本地,用VS開啟,這裡我們新建一個專案ConnectMySql。

2.設定XXX.Web為啟動專案,Build這個Solution,使得NuGet下載相關的包。

3.準備好一個SQL Server資料庫,修改Web.config資料庫的ConnectionString,連線到SQL Server資料庫。

4.開啟Package Manager Console視窗,選擇XXX.EntityFramework為預設專案,執行Update-Database命令,系統會在SQL Server中建立資料庫和對應的表。

image

5.開啟SSMS,連線到上一步新建的資料庫,選擇生成指令碼命令,並在高階選項中選擇“Schema and data”生成一個建立表和填充資料的指令碼檔案。

6.接下來就是比較繁瑣的SQL Server指令碼轉MySQL指令碼了,我採用NotePad++,做了多次的批量替換,把指令碼轉換成MySQL支援的內容。

為了方便大家,我直接把轉換好的SQL指令碼放出,大家直接執行即可。 指令碼下載

7.開啟MySQL Server,新建一個MySQL資料庫,並執行前一步驟準備好的指令碼。

8.我們回到VS,為XXX.EntityFramework和XXX.Web,通過Nuget新增MySql.Data.Entity:

image

9.開啟Web專案的Web.config,由於上一步新增了MySql.Data.Entity,所以Web.config已經新增了MySql的相關配置。我們只需要修改連線字串,註釋掉SQL Server的字串,新增新的連線字串:

<add name="Default" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=test;uid=root;password=xxx" />

10.開啟EntityFramework專案的Configuration物件,在Migrations資料夾中,修改建構函式,指定使用MySQL的SQL生成器。

public Configuration()
       {
           AutomaticMigrationsEnabled = false;
           ContextKey = "ConnectMySql";
          SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
       }

11.現在我們來試一試是否可以針對MySQL使用EF的Code First。我們在XXX.Core中建立一個測試用的實體Student:

public class Student:Entity
  {
      [StringLength(50)]
      public string Name { get; set; }
      public DateTime Birthdate { get; set; }

      public bool Gender { get; set; }
  }

12.在XXX.EntityFramework中找到ConnectMySqlDbContext,並新增Student的應用:

public class ConnectMySqlDbContext : AbpZeroDbContext<Tenant, Role, User>
{
     //TODO: Define an IDbSet for your Entities...
     public IDbSet<Student> Students { get; set; }
     /* NOTE:
      *   Setting "Default" to base class helps us when working migration commands on Package Manager Console.
      *   But it may cause problems when working Migrate.exe of EF. If you will apply migrations on command line, do not
      *   pass connection string name to base classes. ABP works either way.
      */
     public ConnectMySqlDbContext()
         : base("Default")
     {

     }

……

13.我們編譯一下這個Solution,然後在Package Manager Console視窗中,輸入命令Add-Migration AddStudent,這裡的AddStudent是對我們這次更改的一個命令。命令執行完成後,在Migrations資料夾中,會建立升級資料庫的C#程式碼。

image

14.繼續在Package Manager Console視窗中,輸入命令Update-Database,系統會將資料庫更改應用到我們的MySQL資料庫中。

image

15.我們到MySQL資料庫中,重新整理,可以看到系統自動建立了Students資料庫:

image

16.最後,我們Build整個Solution,執行網站,可以看到我們網站正常執行了。

相關文章