1. 程式人生 > >ABP框架使用Mysql資料庫,以及基於SQLServer建立Mysql資料庫的架構和資料

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資料庫的架構和資料的操作