using Microsoft.EntityFrameworkCore;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure;
namespace Rmsys.Infrastructure;
/// 数据库配置(连接串可用环境变量 RMSYS_MYSQL 覆盖)
public static class DbConfig
{
///
/// 默认连接串。注意:
/// · CharSet=utf8mb4 —— 服务端默认 latin1,必须显式指定,否则中文乱码
/// · 口令含 # @ ! 等特殊字符,用单引号包裹
/// · MySQL 5.7.25,SslMode=None(内网)
///
public const string DefaultMySql =
// 兜底默认值(本地安装形态):真实环境由 appsettings.json 或 RMSYS_MYSQL 覆盖,
// 这里不写任何真实服务器与口令,避免口令随二进制外流。
"server=127.0.0.1;port=3307;database=rmsys;user=rmsys;password='';" +
"CharSet=utf8mb4;SslMode=None;AllowPublicKeyRetrieval=true;" +
// 连接池与超时:显式设定,避免默认值在会议高峰期(多人同时导出/上传)耗尽连接
"ConnectionTimeout=10;DefaultCommandTimeout=30;" +
"MinimumPoolSize=2;MaximumPoolSize=40;ConnectionIdleTimeout=60;ConnectionLifeTime=300";
public static string MySql =>
Environment.GetEnvironmentVariable("RMSYS_MYSQL") ?? DefaultMySql;
/// 服务端实测版本 MySQL 5.7.25(显式指定,避免 AutoDetect 需要联网探测)
public static MySqlServerVersion ServerVersion => new(new Version(5, 7, 25));
}
/// 供 EF Core CLI(dotnet ef)在设计时创建上下文
public class RmsysDbContextFactory : Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory
{
public RmsysDbContext CreateDbContext(string[] args)
{
var options = new DbContextOptionsBuilder()
.UseMySql(DbConfig.MySql, DbConfig.ServerVersion)
.Options;
return new RmsysDbContext(options);
}
}