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) { if (_httpContextAccessor == null || _httpContextAccessor.HttpContext == null) { return; } //读取多租户ID string tenantId = _httpContextAccessor.HttpContext.Request.Query[Define.TENANT_ID]; if (string.IsNullOrEmpty(tenantId)) { tenantId = _httpContextAccessor.HttpContext.Request.Headers[Define.TENANT_ID]; } //如果没有租户id,或租户用的是默认的OpenAuthDBContext,则不做任何调整 if (string.IsNullOrEmpty(tenantId) || tenantId == "OpenAuthDBContext") { return; } string connect = _configuration.GetConnectionString(tenantId); if (string.IsNullOrEmpty(connect)) return; var dbType =_appConfiguration.Value.DbType; if (dbType == Define.DBTYPE_SQLSERVER) { optionsBuilder.UseSqlServer(connect); } else //mysql { optionsBuilder.UseMySql(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; } } }