using System; using Infrastructure; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using OpenAuth.Repository.Domain; using OpenAuth.Repository.QueryObj; namespace OpenAuth.Repository { public partial class OpenAuthDBContext : DbContext { private ILoggerFactory _LoggerFactory; private IHttpContextAccessor _httpContextAccessor; private IConfiguration _configuration; private IOptions _appConfiguration; public OpenAuthDBContext(DbContextOptions options, ILoggerFactory loggerFactory, IHttpContextAccessor httpContextAccessor, IConfiguration configuration, IOptions appConfiguration) : base(options) { _LoggerFactory = loggerFactory; _httpContextAccessor = httpContextAccessor; _configuration = configuration; _appConfiguration = appConfiguration; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.EnableSensitiveDataLogging(true); //允许打印参数 optionsBuilder.UseLoggerFactory(_LoggerFactory); InitTenant(optionsBuilder); base.OnConfiguring(optionsBuilder); } //初始化多租户信息,根据租户id调整数据库 private void InitTenant(DbContextOptionsBuilder optionsBuilder) { string tenantId = "OpenAuthDBContext"; if (_httpContextAccessor != null && _httpContextAccessor.HttpContext != null) { //读取多租户ID var httpTenantId = _httpContextAccessor.HttpContext.Request.Query[Define.TENANT_ID]; if (string.IsNullOrEmpty(httpTenantId)) { httpTenantId = _httpContextAccessor.HttpContext.Request.Headers[Define.TENANT_ID]; } //如果没有租户id,或租户用的是默认的OpenAuthDBContext,则不做任何调整 if (!string.IsNullOrEmpty(httpTenantId)) { tenantId = httpTenantId; } } string connect = _configuration.GetConnectionString(tenantId); if (string.IsNullOrEmpty(connect)) { throw new Exception($"未能找到租户{tenantId}对应的连接字符串信息"); } //这个地方如果用IOption,在单元测试的时候会获取不到AppSetting的值😅 var dbType = _configuration.GetSection("AppSetting")["DbType"]; if (dbType == Define.DBTYPE_SQLSERVER) { optionsBuilder.UseSqlServer(connect); } else if(dbType == Define.DBTYPE_MYSQL) //mysql { optionsBuilder.UseMySql(connect); } else { optionsBuilder.UseOracle(connect); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasKey(c => new { c.Id }); } public virtual DbSet Applications { get; set; } public virtual DbSet Categories { get; set; } public virtual DbSet CategoryTypes { get; set; } public virtual DbSet FlowInstances { get; set; } public virtual DbSet FlowInstanceOperationHistorys { get; set; } public virtual DbSet FlowInstanceTransitionHistorys { get; set; } public virtual DbSet FlowSchemes { get; set; } public virtual DbSet
Forms { get; set; } public virtual DbSet Modules { get; set; } public virtual DbSet ModuleElements { get; set; } public virtual DbSet Orgs { get; set; } public virtual DbSet Relevances { get; set; } public virtual DbSet Resources { get; set; } public virtual DbSet Roles { get; set; } public virtual DbSet Users { get; set; } public virtual DbSet UploadFiles { get; set; } public virtual DbSet FrmLeaveReqs { get; set; } public virtual DbSet SysLogs { get; set; } public virtual DbSet SysMessages { get; set; } public virtual DbSet DataPrivilegeRules { get; set; } public virtual DbSet WmsInboundOrderDtbls { get; set; } public virtual DbSet WmsInboundOrderTbls { get; set; } public virtual DbSet OpenJobs { get; set; } public virtual DbSet BuilderTables { get; set; } public virtual DbSet BuilderTableColumns { get; set; } //非数据库表格 public virtual DbQuery SysTableColumns { get; set; } } }