using HZY.Framework.Repository.EntityFramework.Attributes; using HZY.Framework.Repository.EntityFramework.Models.Enums; using HZY.Framework.Repository.EntityFramework.Models; using HZY.Framework.Repository.EntityFramework.Repositories.Impl; using HZY.Framework.Repository.EntityFramework; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HZY.Framework.Repository.EntityFramework.Repositories; using FreeSql.DatabaseModel; using CloudGaming.AppConfigModel; namespace CloudGaming.Code.DataBaseModel; public class BaseDbContext : DbContext, IBaseDbContext { /// /// 工作单元 /// public virtual IUnitOfWork UnitOfWork { get; } private readonly AppConfig _appConfig; private readonly AppDataBaseType _appDataBaseType; private readonly IConfiguration _configuration; private readonly IWebHostEnvironment _webHostEnvironment; public BaseDbContext(IConfiguration configuration, IWebHostEnvironment webHostEnvironment, AppConfig appConfig, AppDataBaseType appDataBaseType) { _configuration = configuration; _webHostEnvironment = webHostEnvironment; _appConfig = appConfig; if (_appConfig == null) { _appConfig = new AppConfig { ExtConnectionString = "Server=1.15.21.245;Database=CloudGamingCBT;User Id=sa;Password=Dbt@com@123;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;", GameConnectionString = "Server=1.15.21.245;Database=CloudGamingGame;User Id=sa;Password=Dbt@com@123;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;", PhoneConnectionString = "Server=1.15.21.245;Database=CloudGamingPhone;User Id=sa;Password=Dbt@com@123;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;", UserConnectionString = "Server=1.15.21.245;Database=CloudGamingUser;User Id=sa;Password=Dbt@com@123;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;", }; } _appDataBaseType = appDataBaseType; } /// /// 获取仓储配置 /// /// /// public RepositoryOptions GetRepositoryOptions() { var repositoryOptions = new RepositoryOptions() { ConnectionString = _appConfig.GetConnectionString(_appDataBaseType), IsMonitorEFCore = true, DefaultDatabaseType = DefaultDatabaseType.SqlServer }; return repositoryOptions; } /// /// 配置 /// /// /// protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var repositoryOptions = this.GetRepositoryOptions(); // 获取连接字符串 var connectionString = repositoryOptions.ConnectionString; connectionString = string.IsNullOrWhiteSpace(connectionString) ? _configuration["ConnectionStrings:" + repositoryOptions!.DefaultDatabaseType.ToString()] : connectionString; switch (repositoryOptions.DefaultDatabaseType) { case DefaultDatabaseType.SqlServer: optionsBuilder .UseSqlServer(connectionString, w => w.MinBatchSize(1).MaxBatchSize(1000)) ; break; case DefaultDatabaseType.MySql: optionsBuilder .UseMySql(connectionString, MySqlServerVersion.LatestSupportedServerVersion, w => w.MinBatchSize(1).MaxBatchSize(1000)) ; break; case DefaultDatabaseType.PostgreSql: optionsBuilder .UseNpgsql(connectionString, w => w.MinBatchSize(1).MaxBatchSize(1000)) ; break; case DefaultDatabaseType.Oracle: optionsBuilder .UseOracle(connectionString, w => w.MinBatchSize(1).MaxBatchSize(1000)) ; break; default: break; } if (_webHostEnvironment.IsDevelopment()) { // sql 日志写入控制台 var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole(configure => { configure.LogToStandardErrorThreshold = LogLevel.Error; })); optionsBuilder.UseLoggerFactory(loggerFactory) //.EnableDetailedErrors() //.EnableSensitiveDataLogging(true) ; } // 懒加载代理 //options.UseLazyLoadingProxies(); //添加 EFCore 监控 和 动态表名 optionsBuilder.AddEntityFrameworkMonitor(repositoryOptions.IsMonitorEFCore); optionsBuilder.AddInterceptors(new AuditInterceptor()); } /// /// 模型创建 /// /// protected override void OnModelCreating(ModelBuilder modelBuilder) { var dbContextConfigAttribute = GetType().GetCustomAttribute()!; dbContextConfigAttribute!.OnModelCreating(modelBuilder, dbContextConfigAttribute.GetModelTypes(GetType())); #region 自动迁移种子数据 //ModelBuilderExtensions.Seed(modelBuilder); #endregion } /// /// /// /// public List GetDbTableInfo() { var list = this.UnitOfWork.FreeSqlOrm.DbFirst.GetTablesByDatabase(); list.ForEach(item => item.Schema = _appDataBaseType.ToString()); return list; } }