using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; namespace WCTDataMiner.Core.Data; /// /// 数据库上下文工厂实现 - 支持SQLite和PostgreSQL切换 /// public class DbContextFactory : IDbContextFactory { private readonly IConfiguration _configuration; public DbContextFactory(IConfiguration configuration) { _configuration = configuration; } public WctMinerDbContext CreateDbContext() { var dbType = _configuration["Database:Type"]?.ToLower() ?? "sqlite"; var optionsBuilder = new DbContextOptionsBuilder(); switch (dbType) { case "postgresql": case "postgres": var pgConnStr = BuildPostgreSqlConnectionString(); optionsBuilder.UseNpgsql(pgConnStr); break; case "sqlite": default: var dbPath = _configuration["Database:Path"] ?? "./data/database/wctminer.db"; EnsureDirectoryExists(dbPath); optionsBuilder.UseSqlite($"Data Source={dbPath}"); break; } #if DEBUG optionsBuilder.EnableSensitiveDataLogging(); optionsBuilder.EnableDetailedErrors(); #endif return new WctMinerDbContext(optionsBuilder.Options); } private string BuildPostgreSqlConnectionString() { var host = _configuration["Database:Host"] ?? "localhost"; var port = _configuration.GetValue("Database:Port", 5432); var name = _configuration["Database:Name"] ?? "wctminer"; var user = _configuration["Database:User"] ?? "postgres"; var password = _configuration["Database:Password"] ?? ""; return $"Host={host};Port={port};Database={name};Username={user};Password={password}"; } private static void EnsureDirectoryExists(string dbPath) { var directory = Path.GetDirectoryName(dbPath); if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) { Directory.CreateDirectory(directory); } } }