Abp Vnext 数据库由SQL server切换MySQL
切换MySQL细节注意事项:
1、appsettings.json配置MySQL版本号
"ConnectionStrings": {"Default": "Server=172.16.34.14\\SQL2014; Database=Diw.MES.PlantDataService;Persist Security Info=True;User ID=webuser;Password=Sesam123!;TrustServerCertificate=True","SIMDataService": "Data Source=127.0.0.1;port=3306;Initial Catalog=Diw.MES.SIMDataService;user ID=root;password=root;charset=utf8mb4;Allow User Variables=True;ConnectionReset=True;AllowLoadLocalInfile=true;"},"MySqlVersion": "8.4.0","BulkExtensions": {"Enable": true},
2、***DbContextFactory调整代码:
/// <summary>
/// 解析MySQL版本(带容错处理)
/// </summary>
private static MySqlServerVersion GetMySqlServerVersion(IConfiguration configuration)
{try{// 从配置读取,默认8.0.29string versionStr = configuration["MySqlVersion"] ?? "8.0.29";var versionParts = versionStr.Split('.').Select(p => int.TryParse(p.Trim(), out int num) ? num : 0).ToArray();// 确保版本号至少包含主、次版本int major = versionParts.Length > 0 ? versionParts[0] : 8;int minor = versionParts.Length > 1 ? versionParts[1] : 0;int build = versionParts.Length > 2 ? versionParts[2] : 0;return new MySqlServerVersion(new Version(major, minor, build));}catch (Exception ex){Console.WriteLine($"警告:MySQL版本解析失败,使用默认版本 8.0.29。错误:{ex.Message}");return new MySqlServerVersion(new Version(8, 0, 29));}
}
3、***Module.cs调整代码
using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using ShardingCore;
using SPC.SIMDataService.VirtualTableRoutes;
using Volo.Abp;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;
namespace SPC.SIMDataService.EntityFrameworkCore;[DependsOn(typeof(SIMDataServiceDomainModule),typeof(AbpEntityFrameworkCoreModule)
)]
public class SIMDataServiceEntityFrameworkCoreModule : AbpModule
{static SIMDataServiceEntityFrameworkCoreModule(){SIMDataServiceEfCoreEntityExtensionMappings.Configure();}public static readonly ILoggerFactory efLogger = LoggerFactory.Create(builder =>{//builder.AddFilter((category, level) => category == DbLoggerCategory.Database.Command.Name && level == LogLevel.Information).AddConsole();});public override void PreConfigureServices(ServiceConfigurationContext context){SIMDataServiceEfCoreEntityExtensionMappings.Configure();}public override void ConfigureServices(ServiceConfigurationContext context){var configuration = context.Services.GetConfiguration();string connString = configuration.GetConnectionString("SIMDataService")?? throw new ArgumentException("未找到 SIMDataService 连接字符串");var Enable = Convert.ToBoolean(configuration["BulkExtensions:Enable"]);var serverVersion = GetMySqlServerVersion(configuration);context.Services.AddAbpDbContext<SIMDataServiceDbContext>(options =>{options.AddDefaultRepositories(includeAllEntities: true);});if (Enable)context.Services.AddScoped<IEfCoreBulkOperationProvider, BulkExtensionsEfCoreBulkOperationProvider>();Configure<AbpDbContextOptions>(options =>{options.UseMySQL(o =>{o.CommandTimeout(60);});options.Configure<SIMDataServiceDbContext>(innerContext =>{innerContext.DbContextOptions.UseDefaultSharding<SIMDataServiceDbContext>(innerContext.ServiceProvider);});});context.Services.AddShardingConfigure<SIMDataServiceDbContext>().UseRouteConfig(op =>{op.AddShardingTableRoute<ShiftDataVirtualTableRoute>();}).UseConfig((sp, op) =>{op.UseShardingQuery((conStr, builder) =>{builder.UseMySql(conStr, serverVersion).UseLoggerFactory(efLogger);});op.UseShardingTransaction((connection, builder) =>{builder.UseMySql(connection, serverVersion).UseLoggerFactory(efLogger);});op.UseShardingMigrationConfigure(builder =>{builder.ReplaceService<IMigrationsSqlGenerator, ShardingMySqlMigrationsSqlGenerator>();});op.AddDefaultDataSource("SIMDataService", connString);}).AddShardingCore();}public override void OnPostApplicationInitialization(ApplicationInitializationContext context){base.OnPostApplicationInitialization(context);//创建表的定时任务如果有按年月日系统默认路由的需要系统创建的记得开起来//context.ServiceProvider.UseAutoShardingCreate();//补偿表 //自动迁移的话不需要//context.ServiceProvider.UseAutoTryCompensateTable();}/// <summary>/// 解析MySQL版本(带容错处理)/// </summary>private static MySqlServerVersion GetMySqlServerVersion(IConfiguration configuration){try{// 从配置读取,默认8.0.29string versionStr = configuration["MySqlVersion"] ?? "8.0.29";var versionParts = versionStr.Split('.').Select(p => int.TryParse(p.Trim(), out int num) ? num : 0).ToArray();// 确保版本号至少包含主、次版本int major = versionParts.Length > 0 ? versionParts[0] : 8;int minor = versionParts.Length > 1 ? versionParts[1] : 0;int build = versionParts.Length > 2 ? versionParts[2] : 0;return new MySqlServerVersion(new Version(major, minor, build));}catch (Exception ex){Console.WriteLine($"警告:MySQL版本解析失败,使用默认版本 8.0.29。错误:{ex.Message}");return new MySqlServerVersion(new Version(8, 0, 29));}}}
4、***MigrationsSqlGenerator调整
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations.Operations;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Update;
using ShardingCore.Core.RuntimeContexts;
using ShardingCore.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Pomelo.EntityFrameworkCore.MySql.Migrations;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure.Internal;namespace SPC.SIMDataService
{public class ShardingMySqlMigrationsSqlGenerator : MySqlMigrationsSqlGenerator{private readonly IShardingRuntimeContext _shardingRuntimeContext;public ShardingMySqlMigrationsSqlGenerator(IShardingRuntimeContext shardingRuntimeContext,MigrationsSqlGeneratorDependencies dependencies,ICommandBatchPreparer commandBatchPreparer,IMySqlOptions options) :base(dependencies,commandBatchPreparer,options){_shardingRuntimeContext = shardingRuntimeContext;}protected override void Generate(MigrationOperation operation,IModel model,MigrationCommandListBuilder builder){var oldCmds = builder.GetCommandList().ToList();base.Generate(operation, model, builder);var newCmds = builder.GetCommandList().ToList();var addCmds = newCmds.Where(x => !oldCmds.Contains(x)).ToList();MigrationHelper.Generate(_shardingRuntimeContext,operation,builder,Dependencies.SqlGenerationHelper,addCmds);}}
}
6、Hangfire与MySQL 新的组件(Hangfire.MySqlStorage)
#region Hangfire与MySQLstring connString = configuration.GetConnectionString("Hangfire")?? throw new ArgumentException("未找到Hangfire连接字符串");context.Services.AddHangfire(config =>{config.SetDataCompatibilityLevel(CompatibilityLevel.Version_180).UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings();config.UseStorage(new MySqlStorage(connString, new MySqlStorageOptions()));});context.Services.AddHangfireServer();context.Services.AddTransient<IBackgroundJobClient, BackgroundJobClient>();#endregion