ABP框架使用Mysql數據庫,以及基於SQLServer創建Mysql數據庫的架構和數據

ABP默認的數據庫是SQLServer,不過ABP框架底層是EF框架,因此也是很容易支持其他類型的數據庫的,本篇隨筆介紹在ABP框架使用Mysql數據庫,以及基於SQLServer創建MySql數據庫的架構和數據的處理。

如果需要其他方式數據庫的支持,那麼需要引入相應的支持程序集。Nuget中安裝MySql相關包,Oracle公司提供的MySql 包試了很多次,都還是用起來有問題,所以現在都是用的第三方的MySql包,這個包也是ABP官方文檔中推薦使用的。

pomelo.entityframeworkcore.mysql

pomelo.entityframeworkcore.mysql.design

目前使用的是基於正式版的.NETCore5.0,那麼Microsoft.EntityFrameworkCore.Relational對應版本是5.0.0。因此,對應這些版本的驅動如下圖所示。

在EntityFrameworkCore層中找到XXDbContextConfigurer,修改DbContext中數據庫配置,默認使用的SqlServer,修改為mysql。 

namespace MyProject.EntityFrameworkCore
{
    /// <summary>
    /// 配置使用特定數據庫的處理
    /// </summary>
    public static class MyProjectDbContextConfigurer
    {
        public static void Configure(DbContextOptionsBuilder<MyProjectDbContext> builder, string connectionString)
        {
            //builder.UseSqlServer(connectionString);//默認SQlServer
            builder.UseMySql(connectionString, new MySqlServerVersion(new Version(5, 7)));//MySQL

            //builder.UseNpgsql(connectionString);//PostgreSQL
            //builder.UseOracle(connectionString);//Oracle
        }

        public static void Configure(DbContextOptionsBuilder<MyProjectDbContext> builder, DbConnection connection)
        {
            //builder.UseSqlServer(connection);//默認SQlServer
            builder.UseMySql(connection, new MySqlServerVersion(new Version(5, 7)));//MySQL

            //builder.UseNpgsql(connection);//PostgreSQL
            //builder.UseOracle(connection);//Oracle
        }
    }
}

其中UseMySql需要用到第二個版本參數,我Mysql用的是Mysql5.7,因此使用代碼構建版本參數。

new MySqlServerVersion(new Version(5, 7)

我們在Host啟動項目裏面的appsettings.json裏面定義了不同數據庫的連接信息,如下所示。

{
  "ConnectionStrings": {
    "Default": "Server=.\\SQL2014; Database=MyProjectDb; Trusted_Connection=True;",
    "Oracle": "User Id=orcl;Password=orcl;Data Source=orcl;Persist Security Info=True;",
    "MySql": "Server=localhost;Database=myprojectdb;Uid=root;Pwd=123456;",
    "PostgreSQL": "Server=localhost;Port=5432;Database=myprojectdb;User Id=postgres;Password=123456"
  },
  "RedisCache": {
    "ConnectionString": "localhost",
    "DatabaseId": "-1"
  },

...............

而我們系統不同的數據庫連接就就是來自ConnectionStrings裏面的鍵值對象,我們ABP框架裏面,使用引用常數來配置對應的數據庫連接。

    public class MyProjectDbContextFactory : IDesignTimeDbContextFactory<MyProjectDbContext>
    {
        public MyProjectDbContext CreateDbContext(string[] args)
        {
            var builder = new DbContextOptionsBuilder<MyProjectDbContext>();

            //獲取配置文件信息
            var configuration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());

            //通過連接字符串切換對應的數據庫,ConnectionStringName默認為Default
            MyProjectDbContextConfigurer.Configure(builder, configuration.GetConnectionString(Constants.ConnectionStringName));

            return new MyProjectDbContext(builder.Options);
        }
    }

那麼我們修改其中對應的常數定義,切換為我們所需要的Mysql數據庫即可,如下所示。

 至此,代碼上修改就完成了,那麼我們現有運行的SQLServer數據庫,如何遷移到Mysql環境中去呢?

 

2、基於SQLServer創建Mysql數據庫的架構和數據

上面小節介紹了切換到其他數據庫Mysql數據庫的時候,代碼上的調整修改,但是我們還需要把已有SQLServer上運行的數據庫遷移到Mysql上去,如何處理呢。

有些人希望通過ABP帶有的Migrator項目進行項目數據庫的重構,不過我不建議使用這個,因為我們實際開發的時候,變動了很多數據庫,而變動了再映射回到代碼裏面,比較麻煩,不如在數據庫基礎上進行遷移來的快捷完整。

我這裡通過工具的方式,把SQLServer數據庫導入到Mysql數據庫裏面,然後在導出腳本進行一定的調整就可以完成。

我這裡說到的工具就是Navicat Premium,由於我的數據庫用的是SQLServer2014,因此建議使用Navicat Premium15或更高版本來處理數據庫的遷移,我測試過Navicat Premium·11是不行的。

在Navicat Premium工具上連接好Mysql數據庫和SQLServer數據庫,然後在Mysql裏面創建一個同名的數據庫,以Utf-8編碼創建數據庫即可,如下所示。 

然後在工具上選擇數據庫傳輸

在彈出的界面中選擇源數據庫和目標數據庫,如下所示。

 然後一步步處理即可完成數據庫結構和數據的導入,這樣Mysql數據庫裏面就有對應的數據庫結構和數據了。

不過完成這部還是不夠十分完美,因為從SQLServer鍾導入到Mysql數據庫裏面,數據庫的自增長列全部被取消了,如果我們在管理界面裏面修改,則無法修改帶有約束關係的主鍵為自增長。

因此我們需要再次調整一下,也就是把Mysql數據庫導出為SQL腳本,然後在腳本上進行一定的調整即可。

 用Notepad++打開導出的數據庫腳本,對自增長的表字段進行添加一個關鍵字AUTO_INCREMENT,標註為自增長即可,如下所示。

 然後刪除已有的Mysql數據庫,然後重新創建對應名稱的數據庫,重新導入Mysql腳本進行運行生成新的表和數據即可完成。

運行ABP後台項目,啟動Swagger界面,如下所示。

然後啟動Vue+Element的客戶端進行測試Mysql數據庫的運行情況,前端正常。

以上就是介紹ABP框架使用Mysql數據庫的代碼調整,以及基於SQLServer創建Mysql數據庫的架構和數據的操作過程