为 Entity Framework Core 切换至其他数据库管理系统
ABP CLI 提供了 -dbms 选项,允许您在创建新解决方案时选择数据库管理系统(DBMS)。该选项接受以下值:
SqlServer(默认)MySQLSQLiteOracleOracle-DevartPostgreSQL
因此,如果您希望在解决方案中使用MySQL,可以在使用abp new命令时添加-dbms MySQL选项。示例:
abp new BookStore -dbms MySQL
此外,ABP官网的 入门页面 也允许您选择其中一种提供程序。
本文档为那些在创建解决方案后希望手动更改DBMS的用户提供指导。
您可以通过以下文档了解如何切换到您喜欢的DBMS:
您也可以不借助这些集成包来配置您的DBMS提供程序。虽然始终推荐使用集成包(它还能为不同模块间依赖的版本建立标准),但如果您的DBMS提供程序没有集成包,您可以自行配置。
例如,本文档将说明如何在不使用 MySQL集成包 的情况下切换到MySQL。
替换SQL Server依赖
- 从
.EntityFrameworkCore项目中移除 Volo.Abp.EntityFrameworkCore.SqlServer NuGet包依赖。 - 向您的
.EntityFrameworkCore项目添加 Pomelo.EntityFrameworkCore.MySql NuGet包依赖。
移除模块依赖
从您的您的项目名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项目以创建数据库并填充初始数据。
运行应用程序
一切准备就绪。只需运行应用程序并开始编码吧。
抠丁客


