using Avalonia_Common.Infrastructure; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Avalonia_EFCore.Database { /// /// 数据库管理器 —— 负责连接测试、自动迁移、种子数据、版本检查。 /// 在应用启动时调用,确保数据库结构与应用代码同步。 /// public class DatabaseManager where TContext : AppDbContext { private readonly TContext _context; private readonly DatabaseConfiguration _config; private readonly IServiceProvider? _serviceProvider; public DatabaseManager(TContext context, DatabaseConfiguration config, IServiceProvider? serviceProvider = null) { _context = context; _config = config; _serviceProvider = serviceProvider; } /// /// 初始化数据库:测试连接 → 自动迁移 → 种子数据。 /// public async Task InitializeAsync(Action? seeder = null) { // 1. 测试数据库连接 var canConnect = await CanConnectAsync(); if (!canConnect) { throw new InvalidOperationException( $"无法连接到数据库 [{_config.Provider}],请检查连接字符串和数据库服务状态。"); } // 2. 自动迁移(如果启用) if (_config.AutoMigrate) { await MigrateAsync(); } // 3. 种子数据 if (seeder != null) { seeder(_context, _serviceProvider); await _context.SaveChangesAsync(); } } /// /// 测试数据库连接是否正常。 /// public async Task CanConnectAsync() { try { return await _context.Database.CanConnectAsync(); } catch { return false; } } /// /// 执行待处理的迁移。 /// 使用 EF Core 原生迁移机制,自动检测并应用 Schema 变更。 /// public async Task MigrateAsync() { try { var pendingMigrations = await _context.Database.GetPendingMigrationsAsync(); if (pendingMigrations.Any()) { AppLog.Information( "检测到 {Count} 个待执行的数据库迁移: {Migrations}", pendingMigrations.Count(), string.Join(", ", pendingMigrations)); await _context.Database.MigrateAsync(); AppLog.Information("数据库迁移完成({Count} 个迁移已应用)", pendingMigrations.Count()); } else { AppLog.Information("数据库已是最新版本,无需迁移"); } } catch (Exception ex) { AppLog.Error(ex, "数据库迁移失败"); throw; } } /// /// 获取数据库当前版本信息。 /// public async Task GetVersionInfoAsync() { var appliedMigrations = await _context.Database.GetAppliedMigrationsAsync(); var pendingMigrations = await _context.Database.GetPendingMigrationsAsync(); return new DatabaseVersionInfo { Provider = _config.Provider.ToString(), AppliedMigrations = appliedMigrations.ToList(), PendingMigrations = pendingMigrations.ToList(), IsLatest = !pendingMigrations.Any(), CanConnect = await CanConnectAsync(), }; } /// /// 生成从指定迁移到最新版本的 SQL 脚本(用于生产环境审计)。 /// public string GenerateMigrationScript(string? fromMigration = null) { var migrator = _context.GetService(); return fromMigration is null ? migrator.GenerateScript() : migrator.GenerateScript(fromMigration); } /// /// 确保数据库已创建(不执行迁移,适用于简单场景)。 /// public bool EnsureCreated() { return _context.Database.EnsureCreated(); } } /// /// 数据库版本信息 DTO。 /// public class DatabaseVersionInfo { public string Provider { get; set; } = string.Empty; public List AppliedMigrations { get; set; } = new(); public List PendingMigrations { get; set; } = new(); public bool IsLatest { get; set; } public bool CanConnect { get; set; } } }