abp vNext 使用MySql数据库配置说明
1、开发环境
- 开发工具:Vs2019
- 运行时:dotnet core 3.1
- 数据库:mariadb或MySql
- abp版本:2.0.0
2、项目创建
先按照abp官方CLI,
dotnet tool install -g Volo.Abp.Cli
如果之前安装过,更新可以使用:
dotnet tool update -g Volo.Abp.Cli
使用abp官方CLI工具创建项目,
abp new Acme.BookStore
当前版本abp,还支持创建项目时指定mongodb数据库,命令如下:
abp new Acme.BookStore -d mongodb
3、更改数据库配置
等待项目构建完成,使用Vs打开项目,进行Nuget还原。abp CLI构建的项目默认使用了SqlServer数据库。本文将介绍在abp vNext 2.0.0版本下构建的项目,如何切换为使用MySql数据库。请注意版本,因abp vNext前期更新变动较大,所以不同版本之间的修改可能不尽相同。
1、修改数据库连接字符串
在Acme.BookStore.Web项目中,打开其中“appsetting.json”文件,修改其中连接字符串为MySql格式,例子如下:
"ConnectionStrings": {
"Default": "server=localhost;port=3306;database=testdb;User ID=root;Password=123456;"
},
2、管理“Acme.BookStore.EntityFrameworkCore”项目中Nuget程序包,卸载其中的“Volo.Abp.EntityFrameworkCore.SqlServer”包,并浏览安装“Volo.Abp.EntityFrameworkCore.MySQL”程序包。如下图
3、将错误提示中的“UseSqlServer”代码替换为“UseMysql"。
有两部分需要修改:
“Acme.BookStore.EntityFrameworkCore”项目中的BookStoreEntityFrameworkCoreModule.cs文件中options.UseSQLServer()
修改为:options.UseMySQL()
。
将依赖项目“typeof(AbpEntityFrameworkCoreSqlServerModule)
”修改为“typeof(AbpEntityFrameworkCoreMySQLModule)
”。
并删除无效的using引用。
“Acme.BookStore.EntityFrameworkCore.DbMigrations”项目中的BookStoreMigrationsDbContextFactory.cs
文件中
var builder = new DbContextOptionsBuilder<EyinzhangMigrationsDbContext>()
.UseSqlServer(configuration.GetConnectionString("Default"));
修改为:
var builder = new DbContextOptionsBuilder<EyinzhangMigrationsDbContext>()
.UseMySql(configuration.GetConnectionString("Default"));
注意这两处修改的红色部分的MySql的大小写是不一样的。
4、修改Web项目中错误
删除"Acme.BookStore.EntityFrameworkCore.DbMigrations”项目下的Migrator文件夹,重新生成解决方案。如果,出现如下图错误提示,
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CS8652 功能“可为 null 的引用类型”当前为预览版且不受支持。要使用预览版功能,请使用“预览”语言版本。 Acme.BookStore.Web F:Acme.BookStoresrcAcme.BookStore.WebobjDebugnetcoreapp3.1RazorPagesIndex.cshtml.g.cs 134 活动的
此为使用了预览版功能造成的,可在“Acme.BookStore.Web”项目中,打开Pages文件夹下的Index.chtml
文件,将如图所示部分注释掉,后期再根据个人情况修改即可。
5、重新生成迁移
至此,Mysql配置的修改基本完成,项目也没有错误提示了,将Acme.BookStore.Web项目设置为启动项目,在程序包管理控制台,将默认项目设置为“Acme.BookStore.EntityFrameworkCore.DbMigrations”,输入add-migration
命令重新生成迁移。
PM> add-migration
位于命令管道位置 1 的 cmdlet Add-Migration
请为以下参数提供值:
Name: init
Build started...
Build succeeded.
To undo this action, use Remove-Migration.
PM>
如上,可以正常生成迁移文件。但是在执行update-database
时,会提示如下错误:
Failed executing DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLEIdentityServerApiSecrets
(`Type` varchar(250) CHARACTER SET utf8mb4 NOT NULL, `Value` longtext CHARACTER SET utf8mb4 NOT NULL, `ApiResourceId` char(36) NOT NULL, `Description` varchar(2000) CHARACTER SET utf8mb4 NULL, `Expiration` datetime(6) NULL, CONSTRAINT `PK_IdentityServerApiSecrets` PRIMARY KEY (`ApiResourceId`, `Type`, `Value`), CONSTRAINT `FK_IdentityServerApiSecrets_IdentityServerApiResources_ApiResou~` FOREIGN KEY (`ApiResourceId`) REFERENCES `IdentityServerApiResources` (`Id`) ON DELETE CASCADE
);
.....
BLOB/TEXT column 'Value' used in key specification without a key length
6、修改无法创建表IdentityServerApiSecurity
的错误
针对如上问题,可使用下面的步骤解决:
参考:https://github.com/abpframework/abp/issues/2053
在MysqlDemo.EntityFrameworkCore项目,“EntityFrameworkCore”文件夹下,添加IdentityServerModelCreatingExtensions
类。代码如下:
public static class IdentityServerModelCreatingExtensions
{
public static void ConfigureIdentityServerForMySQL(this ModelBuilder builder)
{
// Solve the problem of MySQL migration
// https://github.com/abpframework/abp/issues/1920
builder.Entity<ApiSecret>(b =>
{
// After trying, you can also set it to 400
b.Property(x => x.Value).HasMaxLength(300);
});
builder.Entity<ClientPostLogoutRedirectUri>(b =>
{
b.Property(x => x.PostLogoutRedirectUri).HasMaxLength(300); // or 400 ?
});
builder.Entity<ClientRedirectUri>(b =>
{
b.Property(x => x.RedirectUri).HasMaxLength(300); // or 400 ?
});
builder.Entity<ClientSecret>(b =>
{
b.Property(x => x.Value).HasMaxLength(300); // or 400 ?
});
}
}
在BookStoreDbContext
类中OnModelCreating
方法末尾,添加如下代码,并添加对应using引用:
builder.ConfigureIdentityServer(options =>
{
options.DatabaseProvider = EfCoreDatabaseProvider.MySql;
});
builder.ConfigureIdentityServerForMySQL();
在BookStoreDbContextModelCreatingExtensions
文件中ConfigureBookStore
方法下添加如下代码:
builder.ConfigureIdentityServer(options =>
{
options.DatabaseProvider = EfCoreDatabaseProvider.MySql;
});
全部修改完成后,删除Migration文件夹,重新执行add-migration
生成迁移,并执行update-database
命令,同步数据库。成功!