项目

为 Entity Framework Core 切换至其他数据库管理系统

ABP CLI 提供了 -dbms 选项,允许您在创建新解决方案时选择数据库管理系统(DBMS)。该选项接受以下值:

  • SqlServer(默认)
  • MySQL
  • SQLite
  • Oracle
  • Oracle-Devart
  • PostgreSQL

因此,如果您希望在解决方案中使用MySQL,可以在使用abp new命令时添加-dbms MySQL选项。示例:

abp new BookStore -dbms MySQL

此外,ABP官网的 入门页面 也允许您选择其中一种提供程序。

本文档为那些在创建解决方案后希望手动更改DBMS的用户提供指导。

您可以通过以下文档了解如何切换到您喜欢的DBMS

您也可以不借助这些集成包来配置您的DBMS提供程序。虽然始终推荐使用集成包(它还能为不同模块间依赖的版本建立标准),但如果您的DBMS提供程序没有集成包,您可以自行配置。

例如,本文档将说明如何在不使用 MySQL集成包 的情况下切换到MySQL。

替换SQL Server依赖

移除模块依赖

从您的您的项目名EntityFrameworkCoreModule类的依赖列表中移除AbpEntityFrameworkCoreSqlServerModule

更改UseSqlServer()调用

您的项目名EntityFrameworkCoreModule类中找到以下代码部分:

Configure<AbpDbContextOptions>(options =>
{
    options.UseSqlServer();
});

将其替换为以下代码:

Configure<AbpDbContextOptions>(options =>
{
    options.Configure(ctx =>
    {
        if (ctx.ExistingConnection != null)
        {
            ctx.DbContextOptions.UseMySql(ctx.ExistingConnection);
        }
        else
        {
            ctx.DbContextOptions.UseMySql(ctx.ConnectionString);
        }
    });
});
  • 此代码中的UseMySql调用由Pomelo.EntityFrameworkCore.MySql包定义,您可以根据需要使用其附加选项。
  • 这段代码首先检查当前请求中是否存在到同一数据库的现有(活动)连接,并在可能的情况下复用该连接。这允许在不同的DbContext类型之间共享单个事务。ABP会处理其余事项。
  • 如果没有活动连接,它会使用ctx.ConnectionString并将其传递给UseMySql(这将导致创建新的数据库连接)。此处使用ctx.ConnectionString很重要。不要传递静态连接字符串(或来自配置的连接字符串)。因为ABP在多数据库或 多租户 环境中 动态确定正确的连接字符串

更改连接字符串

MySQL连接字符串与SQL Server连接字符串不同。因此,请检查解决方案中的所有appsettings.json文件并替换其中的连接字符串。有关MySQL连接字符串选项的详细信息,请参阅connectionstrings.com

通常您需要更改.DbMigrator.Web项目中的appsettings.json,但这取决于您的解决方案结构。

DBMS限制

MySQL DBMS与SQL Server有一些细微差异。某些模块的数据库映射配置(特别是字段长度)会导致MySQL出现问题。例如,IdentityServer模块 的某些表存在此类问题,它提供了一个选项来根据您的DBMS配置字段。

模块可能提供一些内置解决方案。您可以通过ModelBuilder进行配置,例如:Auth Server模块。

builder.ConfigureIdentityServer(options =>
{
    options.DatabaseProvider = EfCoreDatabaseProvider.MySql;
});

然后,ConfigureIdentityServer()方法将设置字段长度,使其不超过MySQL的限制。如果在创建或执行数据库迁移时遇到任何问题,请参考相关模块文档。

重新生成迁移

启动模板使用 Entity Framework Core的Code First Migrations 。EF Core迁移依赖于所选的DBMS提供程序。因此,更改DBMS提供程序将导致迁移失败。

  • 删除.EntityFrameworkCore项目下的Migrations文件夹,并重新构建解决方案。
  • 在包管理器控制台中运行Add-Migration "Initial"(在解决方案资源管理器中选择.DbMigrator(或.Web)项目作为启动项目,并在包管理器控制台中选择.EntityFrameworkCore项目作为默认项目)。

这将创建一个包含所有已配置数据库对象(表)的数据库迁移。

运行.DbMigrator项目以创建数据库并填充初始数据。

运行应用程序

一切准备就绪。只需运行应用程序并开始编码吧。

相关讨论:https://github.com/abpframework/abp/issues/1920

在本文档中