diff --git a/aspnet-core/migrations/Migrate.ps1 b/aspnet-core/migrations/Migrate.ps1 new file mode 100755 index 000000000..badbbb349 --- /dev/null +++ b/aspnet-core/migrations/Migrate.ps1 @@ -0,0 +1,206 @@ +# 数据库迁移脚本 + +# 导入必要的模块 +using namespace System.Management.Automation.Host + +# 加入环境变量FROM_MIGRATION,使其在Program.cs文件中可以进行判断 +$env:FROM_MIGRATION = "true" + +# 定义项目路径 +$projectPath = Resolve-Path (Join-Path $PSScriptRoot "..") + +# 定义可用的DbContext +$dbContexts = @{ + "1" = @{ + Name = "LY.MicroService.Applications.Single.EntityFrameworkCore.MySql" + Factory = "SingleMySqlDbContextFactory" + } + "2" = @{ + Name = "LY.MicroService.Applications.Single.EntityFrameworkCore.PostgreSql" + Factory = "SinglePostgreSqlDbContextFactory" + } +} + +# 显示DbContext选择菜单 +function Show-DbContextMenu { + $host.UI.RawUI.BackgroundColor = "Black" + $host.UI.RawUI.ForegroundColor = "White" + Clear-Host + + Write-Host "========================================" -ForegroundColor Cyan + Write-Host " 数据库迁移上下文选择" -ForegroundColor Yellow + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "" + Write-Host "请选择要迁移的数据库上下文:" -ForegroundColor Green + foreach ($key in $dbContexts.Keys) { + $context = $dbContexts[$key] + Write-Host "[$key] " -NoNewline -ForegroundColor Magenta + Write-Host "$($context.Name)" -ForegroundColor White + } + Write-Host "" +} + +# 选择DbContext +function Select-DbContext { + Show-DbContextMenu + + while ($true) { + $choice = Read-Host "请输入数字选择" + if ($dbContexts.ContainsKey($choice)) { + return $dbContexts[$choice] + } + Write-Host "无效的选择,请重新输入。" -ForegroundColor Red + } +} + +# 获取迁移名称 +function Get-MigrationName { + $defaultName = "AddNewMigration_" + (Get-Date -Format "yyyyMMdd_HHmmss") + $migrationName = Read-Host "请输入迁移名称 (留空将使用默认名称: $defaultName)" + + return ($migrationName ? $migrationName : $defaultName) +} + +# 执行数据库迁移 +function Invoke-DatabaseMigration($dbContext, $migrationName) { + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "正在执行数据库迁移..." -ForegroundColor Green + Write-Host "上下文: " -NoNewline -ForegroundColor Yellow + Write-Host "$($dbContext.Name)" -ForegroundColor White + Write-Host "迁移名称: " -NoNewline -ForegroundColor Yellow + Write-Host "$migrationName" -ForegroundColor White + Write-Host "项目路径: " -NoNewline -ForegroundColor Yellow + Write-Host "$projectPath" -ForegroundColor White + Write-Host "========================================" -ForegroundColor Cyan + + # 切换到项目目录并执行迁移 + Push-Location $projectPath + try { + dotnet ef migrations add $migrationName --project "migrations/$($dbContext.Name)" --context "$($dbContext.Name)DbContext" + } + finally { + Pop-Location + } +} + +# 获取所有迁移文件 +function Get-AllMigrations($dbContext) { + Push-Location $projectPath + try { + $migrations = @(dotnet ef migrations list --project "migrations/$($dbContext.Name)" --context "$($dbContext.Name)DbContext") + return $migrations | Where-Object { $_ -match '\S' } # 过滤空行 + } + finally { + Pop-Location + } +} + +# 选择起始迁移 +function Select-FromMigration($dbContext) { + $migrations = Get-AllMigrations -dbContext $dbContext + + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "可用的迁移文件:" -ForegroundColor Yellow + Write-Host "========================================" -ForegroundColor Cyan + + for ($i = 0; $i -lt $migrations.Count; $i++) { + Write-Host "[$i] " -NoNewline -ForegroundColor Magenta + Write-Host "$($migrations[$i])" -ForegroundColor White + } + + Write-Host "[A] " -NoNewline -ForegroundColor Magenta + Write-Host "生成所有迁移的SQL脚本" -ForegroundColor White + Write-Host "[L] " -NoNewline -ForegroundColor Magenta + Write-Host "仅生成最新迁移的SQL脚本" -ForegroundColor White + + while ($true) { + $choice = Read-Host "请选择起始迁移文件" + if ($choice -eq "A" -or $choice -eq "a") { + return $null + } + if ($choice -eq "L" -or $choice -eq "l") { + if ($migrations.Count -gt 1) { + return $migrations[$migrations.Count - 2] + } + return $null + } + if ([int]::TryParse($choice, [ref]$null)) { + $index = [int]$choice + if ($index -ge 0 -and $index -lt $migrations.Count) { + return $migrations[$index] + } + } + Write-Host "无效的选择,请重新输入。" -ForegroundColor Red + } +} + +# 生成SQL脚本 +function Export-SqlScript($dbContext, $migrationName) { + $choice = Read-Host "是否生成SQL迁移脚本?(Y/N)" + + if ($choice -eq "Y" -or $choice -eq "y") { + $sqlFileName = (Get-Date -Format "yyyyMMddHHmm") + ".sql" + $initSqlPath = Join-Path $projectPath "InitSql" + $contextSqlPath = Join-Path $initSqlPath $dbContext.Name + + # 确保InitSql和上下文特定目录存在 + if (-not (Test-Path $initSqlPath)) { + New-Item -ItemType Directory -Path $initSqlPath | Out-Null + } + if (-not (Test-Path $contextSqlPath)) { + New-Item -ItemType Directory -Path $contextSqlPath | Out-Null + } + + $sqlFilePath = Join-Path $contextSqlPath $sqlFileName + + # 选择起始迁移 + $fromMigration = Select-FromMigration -dbContext $dbContext + + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "正在生成SQL脚本..." -ForegroundColor Green + Write-Host "输出路径: " -NoNewline -ForegroundColor Yellow + Write-Host "$sqlFilePath" -ForegroundColor White + if ($fromMigration) { + Write-Host "起始迁移: " -NoNewline -ForegroundColor Yellow + Write-Host "$fromMigration" -ForegroundColor White + } + Write-Host "========================================" -ForegroundColor Cyan + + # 切换到项目目录并生成SQL脚本 + Push-Location $projectPath + try { + if ($fromMigration) { + dotnet ef migrations script $fromMigration --project "migrations/$($dbContext.Name)" --context "$($dbContext.Name)DbContext" --output $sqlFilePath + } + else { + dotnet ef migrations script --project "migrations/$($dbContext.Name)" --context "$($dbContext.Name)DbContext" --output $sqlFilePath + } + } + finally { + Pop-Location + } + + Write-Host "SQL脚本已生成: " -NoNewline -ForegroundColor Green + Write-Host "$sqlFilePath" -ForegroundColor White + } +} + +# 主执行流程 +try { + $dbContext = Select-DbContext + $migrationName = Get-MigrationName + Invoke-DatabaseMigration -dbContext $dbContext -migrationName $migrationName + + # 生成SQL脚本 + Export-SqlScript -dbContext $dbContext -migrationName $migrationName + + Write-Host "迁移完成!" -ForegroundColor Green +} +catch { + Write-Host "迁移过程中发生错误:" -ForegroundColor Red + Write-Host $_.Exception.Message -ForegroundColor Red +} +finally { + Write-Host "`n按任意键退出..." + $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") +} diff --git a/aspnet-core/migrations/MigrateEn.ps1 b/aspnet-core/migrations/MigrateEn.ps1 new file mode 100644 index 000000000..f02a0e085 --- /dev/null +++ b/aspnet-core/migrations/MigrateEn.ps1 @@ -0,0 +1,206 @@ +# Database Migration Script + +# Import required modules +using namespace System.Management.Automation.Host + +# Add environment variable FROM_MIGRATION for Program.cs to use +$env:FROM_MIGRATION = "true" + +# Define project path +$projectPath = Resolve-Path (Join-Path $PSScriptRoot "..") + +# Define available DbContexts +$dbContexts = @{ + "1" = @{ + Name = "LY.MicroService.Applications.Single.EntityFrameworkCore.MySql" + Factory = "SingleMySqlDbContextFactory" + } + "2" = @{ + Name = "LY.MicroService.Applications.Single.EntityFrameworkCore.PostgreSql" + Factory = "SinglePostgreSqlDbContextFactory" + } +} + +# Display DbContext selection menu +function Show-DbContextMenu { + $host.UI.RawUI.BackgroundColor = "Black" + $host.UI.RawUI.ForegroundColor = "White" + Clear-Host + + Write-Host "========================================" -ForegroundColor Cyan + Write-Host " Database Migration Context Selection" -ForegroundColor Yellow + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "" + Write-Host "Please select a database context to migrate:" -ForegroundColor Green + foreach ($key in $dbContexts.Keys) { + $context = $dbContexts[$key] + Write-Host "[$key] " -NoNewline -ForegroundColor Magenta + Write-Host "$($context.Name)" -ForegroundColor White + } + Write-Host "" +} + +# Select DbContext +function Select-DbContext { + Show-DbContextMenu + + while ($true) { + $choice = Read-Host "Please enter a number to select" + if ($dbContexts.ContainsKey($choice)) { + return $dbContexts[$choice] + } + Write-Host "Invalid selection, please try again." -ForegroundColor Red + } +} + +# Get migration name +function Get-MigrationName { + $defaultName = "AddNewMigration_" + (Get-Date -Format "yyyyMMdd_HHmmss") + $migrationName = Read-Host "Enter migration name (press Enter to use default: $defaultName)" + + return ($migrationName ? $migrationName : $defaultName) +} + +# Execute database migration +function Invoke-DatabaseMigration($dbContext, $migrationName) { + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "Executing database migration..." -ForegroundColor Green + Write-Host "Context: " -NoNewline -ForegroundColor Yellow + Write-Host "$($dbContext.Name)" -ForegroundColor White + Write-Host "Migration Name: " -NoNewline -ForegroundColor Yellow + Write-Host "$migrationName" -ForegroundColor White + Write-Host "Project Path: " -NoNewline -ForegroundColor Yellow + Write-Host "$projectPath" -ForegroundColor White + Write-Host "========================================" -ForegroundColor Cyan + + # Switch to project directory and execute migration + Push-Location $projectPath + try { + dotnet ef migrations add $migrationName --project "migrations/$($dbContext.Name)" --context "$($dbContext.Name)DbContext" + } + finally { + Pop-Location + } +} + +# Get all migration files +function Get-AllMigrations($dbContext) { + Push-Location $projectPath + try { + $migrations = @(dotnet ef migrations list --project "migrations/$($dbContext.Name)" --context "$($dbContext.Name)DbContext") + return $migrations | Where-Object { $_ -match '\S' } # Filter empty lines + } + finally { + Pop-Location + } +} + +# Select migration to start from +function Select-FromMigration($dbContext) { + $migrations = Get-AllMigrations -dbContext $dbContext + + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "Available migrations:" -ForegroundColor Yellow + Write-Host "========================================" -ForegroundColor Cyan + + for ($i = 0; $i -lt $migrations.Count; $i++) { + Write-Host "[$i] " -NoNewline -ForegroundColor Magenta + Write-Host "$($migrations[$i])" -ForegroundColor White + } + + Write-Host "[A] " -NoNewline -ForegroundColor Magenta + Write-Host "Generate SQL script for all migrations" -ForegroundColor White + Write-Host "[L] " -NoNewline -ForegroundColor Magenta + Write-Host "Generate SQL script for latest migration only" -ForegroundColor White + + while ($true) { + $choice = Read-Host "Select a migration to start from" + if ($choice -eq "A" -or $choice -eq "a") { + return $null + } + if ($choice -eq "L" -or $choice -eq "l") { + if ($migrations.Count -gt 1) { + return $migrations[$migrations.Count - 2] + } + return $null + } + if ([int]::TryParse($choice, [ref]$null)) { + $index = [int]$choice + if ($index -ge 0 -and $index -lt $migrations.Count) { + return $migrations[$index] + } + } + Write-Host "Invalid selection, please try again." -ForegroundColor Red + } +} + +# Generate SQL script +function Export-SqlScript($dbContext, $migrationName) { + $choice = Read-Host "Do you want to generate SQL migration script? (Y/N)" + + if ($choice -eq "Y" -or $choice -eq "y") { + $sqlFileName = (Get-Date -Format "yyyyMMddHHmm") + ".sql" + $initSqlPath = Join-Path $projectPath "InitSql" + $contextSqlPath = Join-Path $initSqlPath $dbContext.Name + + # Ensure InitSql and context-specific directories exist + if (-not (Test-Path $initSqlPath)) { + New-Item -ItemType Directory -Path $initSqlPath | Out-Null + } + if (-not (Test-Path $contextSqlPath)) { + New-Item -ItemType Directory -Path $contextSqlPath | Out-Null + } + + $sqlFilePath = Join-Path $contextSqlPath $sqlFileName + + # Select starting migration + $fromMigration = Select-FromMigration -dbContext $dbContext + + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "Generating SQL script..." -ForegroundColor Green + Write-Host "Output path: " -NoNewline -ForegroundColor Yellow + Write-Host "$sqlFilePath" -ForegroundColor White + if ($fromMigration) { + Write-Host "Starting from migration: " -NoNewline -ForegroundColor Yellow + Write-Host "$fromMigration" -ForegroundColor White + } + Write-Host "========================================" -ForegroundColor Cyan + + # Switch to project directory and generate SQL script + Push-Location $projectPath + try { + if ($fromMigration) { + dotnet ef migrations script $fromMigration --project "migrations/$($dbContext.Name)" --context "$($dbContext.Name)DbContext" --output $sqlFilePath + } + else { + dotnet ef migrations script --project "migrations/$($dbContext.Name)" --context "$($dbContext.Name)DbContext" --output $sqlFilePath + } + } + finally { + Pop-Location + } + + Write-Host "SQL script generated: " -NoNewline -ForegroundColor Green + Write-Host "$sqlFilePath" -ForegroundColor White + } +} + +# Main execution +try { + $dbContext = Select-DbContext + $migrationName = Get-MigrationName + Invoke-DatabaseMigration -dbContext $dbContext -migrationName $migrationName + + # Generate SQL script + Export-SqlScript -dbContext $dbContext -migrationName $migrationName + + Write-Host "Migration completed successfully!" -ForegroundColor Green +} +catch { + Write-Host "An error occurred during migration:" -ForegroundColor Red + Write-Host $_.Exception.Message -ForegroundColor Red +} +finally { + Write-Host "`nPress any key to exit..." + $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") +}