using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; namespace Gpulse.WCT.DataAnalyzer.Core.Infrastructure.LocalData; /// /// 数据库上下文工厂实现 - 支持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:LocalPath"] ?? _configuration["Database:Path"] ?? "./data/database/local.db"; EnsureDirectoryExists(dbPath); optionsBuilder.UseSqlite($"Data Source={dbPath}"); break; } #if DEBUG optionsBuilder.EnableSensitiveDataLogging(); optionsBuilder.EnableDetailedErrors(); #endif var context = new WctMinerDbContext(optionsBuilder.Options); // 确保数据库和表结构已创建(适用于 SQLite) context.Database.EnsureCreated(); return context; } 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); } } }