266 lines
9.4 KiB
Markdown
266 lines
9.4 KiB
Markdown
# migration-local
|
|
|
|
## When to Use
|
|
|
|
Use this command when you want to:
|
|
- Create a new EF Core migration based on model changes
|
|
- Apply the migration to your local PostgreSQL database
|
|
- Update your local database schema to match the current code
|
|
|
|
## Prerequisites
|
|
|
|
- .NET SDK installed (`dotnet --version`)
|
|
- PostgreSQL running locally
|
|
- Local database connection configured (default: `Host=localhost;Port=5432;Database=managing;Username=postgres;Password=postgres`)
|
|
|
|
## Execution Steps
|
|
|
|
### Step 1: Verify Database Project Structure
|
|
|
|
Check that the database project exists:
|
|
- Database project: `src/Managing.Infrastructure.Database`
|
|
- Startup project: `src/Managing.Api`
|
|
- Migrations folder: `src/Managing.Infrastructure.Database/Migrations`
|
|
|
|
### Step 2: Build the Solution
|
|
|
|
Before creating migrations, ensure the solution builds successfully:
|
|
|
|
Run: `dotnet build src/Managing.sln`
|
|
|
|
**If build succeeds:**
|
|
- Continue to Step 3
|
|
|
|
**If build fails:**
|
|
- Show build errors
|
|
- Analyze errors:
|
|
- C# compilation errors
|
|
- Missing dependencies
|
|
- Configuration errors
|
|
- **Try to fix errors automatically:**
|
|
- Fix C# compilation errors
|
|
- Fix missing imports
|
|
- Fix configuration issues
|
|
- **If errors can be fixed:**
|
|
- Fix the errors
|
|
- Re-run build
|
|
- If build succeeds, continue to Step 3
|
|
- If build still fails, show errors and ask user for help
|
|
- **If errors cannot be fixed automatically:**
|
|
- Show detailed error messages
|
|
- Explain what needs to be fixed
|
|
- **STOP**: Do not proceed until build succeeds
|
|
|
|
### Step 3: Check for Pending Model Changes
|
|
|
|
Check if there are any pending model changes that require a new migration:
|
|
|
|
Run: `cd src/Managing.Infrastructure.Database && dotnet ef migrations add --dry-run --startup-project ../Managing.Api --name "CheckPendingChanges_$(date +%s)"`
|
|
|
|
**If no pending changes detected:**
|
|
- Inform: "✅ No pending model changes detected. All migrations are up to date."
|
|
- Ask user: "Do you want to create a migration anyway? (y/n)"
|
|
- If yes: Continue to Step 4
|
|
- If no: **STOP** - No migration needed
|
|
|
|
**If pending changes detected:**
|
|
- Show what changes require migrations
|
|
- Continue to Step 4
|
|
|
|
### Step 4: Generate Migration Name
|
|
|
|
Ask the user for a migration name, or generate one automatically:
|
|
|
|
**Option 1: User provides name**
|
|
- Prompt: "Enter a migration name (e.g., 'AddBacktestJobsTable'):"
|
|
- Use the provided name
|
|
|
|
**Option 2: Auto-generate name**
|
|
- Analyze model changes to suggest a descriptive name
|
|
- Format: `Add[Entity]Table`, `Update[Entity]Field`, `Remove[Entity]Field`, etc.
|
|
- Examples:
|
|
- `AddBacktestJobsTable`
|
|
- `AddJobTypeToBacktestJobs`
|
|
- `UpdateUserTableSchema`
|
|
- Ask user to confirm or modify the suggested name
|
|
|
|
### Step 5: Create Migration
|
|
|
|
Create the migration using EF Core:
|
|
|
|
Run: `cd src/Managing.Infrastructure.Database && dotnet ef migrations add "<migration-name>" --startup-project ../Managing.Api`
|
|
|
|
**If migration creation succeeds:**
|
|
- Show: "✅ Migration created successfully: <migration-name>"
|
|
- Show the migration file path
|
|
- Continue to Step 6
|
|
|
|
**If migration creation fails:**
|
|
- Show error details
|
|
- Common issues:
|
|
- Database connection issues
|
|
- Model configuration errors
|
|
- Missing design-time factory
|
|
- **Try to fix automatically:**
|
|
- Check connection string in `DesignTimeDbContextFactory.cs`
|
|
- Verify database is running
|
|
- Check model configurations
|
|
- **If errors can be fixed:**
|
|
- Fix the errors
|
|
- Re-run migration creation
|
|
- If succeeds, continue to Step 6
|
|
- **If errors cannot be fixed:**
|
|
- Show detailed error messages
|
|
- Explain what needs to be fixed
|
|
- **STOP**: Do not proceed until migration is created
|
|
|
|
### Step 6: Review Migration File (Optional)
|
|
|
|
Show the user the generated migration file:
|
|
|
|
Run: `cat src/Managing.Infrastructure.Database/Migrations/<timestamp>_<migration-name>.cs`
|
|
|
|
Ask: "Review the migration file above. Does it look correct? (y/n)"
|
|
|
|
**If user confirms:**
|
|
- Continue to Step 7
|
|
|
|
**If user wants to modify:**
|
|
- Allow user to edit the migration file
|
|
- After editing, ask to confirm again
|
|
- Continue to Step 7
|
|
|
|
### Step 7: Apply Migration to Local Database
|
|
|
|
Apply the migration to the local database:
|
|
|
|
Run: `cd src/Managing.Infrastructure.Database && dotnet ef database update --startup-project ../Managing.Api`
|
|
|
|
**If update succeeds:**
|
|
- Show: "✅ Migration applied successfully to local database"
|
|
- Show: "Database schema updated: <migration-name>"
|
|
- Continue to Step 8
|
|
|
|
**If update fails:**
|
|
- Show error details
|
|
- Common issues:
|
|
- Database connection issues
|
|
- Migration conflicts
|
|
- Database schema conflicts
|
|
- Constraint violations
|
|
- **Try to fix automatically:**
|
|
- Check database connection
|
|
- Check for conflicting migrations
|
|
- Verify database state
|
|
- **If errors can be fixed:**
|
|
- Fix the errors
|
|
- Re-run database update
|
|
- If succeeds, continue to Step 8
|
|
- **If errors cannot be fixed:**
|
|
- Show detailed error messages
|
|
- Explain what needs to be fixed
|
|
- Suggest: "You may need to manually fix the database or rollback the migration"
|
|
- **STOP**: Do not proceed until migration is applied
|
|
|
|
### Step 8: Verify Migration Status
|
|
|
|
Verify that the migration was applied successfully:
|
|
|
|
Run: `cd src/Managing.Infrastructure.Database && dotnet ef migrations list --startup-project ../Managing.Api`
|
|
|
|
**If migration is listed as applied:**
|
|
- Show: "✅ Migration status verified"
|
|
- Show the list of applied migrations
|
|
- Success message: "✅ Migration created and applied successfully!"
|
|
|
|
**If migration is not listed or shows as pending:**
|
|
- Warn: "⚠️ Migration may not have been applied correctly"
|
|
- Show migration list
|
|
- Suggest checking the database manually
|
|
|
|
## Error Handling
|
|
|
|
### If build fails:
|
|
- **STOP immediately** - Do not create migrations for broken code
|
|
- Show build errors in detail
|
|
- Try to fix common errors automatically:
|
|
- C# compilation errors
|
|
- Import path errors
|
|
- Syntax errors
|
|
- Missing imports
|
|
- If errors can be fixed:
|
|
- Fix them automatically
|
|
- Re-run build
|
|
- If build succeeds, continue
|
|
- If build still fails, show errors and ask for help
|
|
- If errors cannot be fixed:
|
|
- Show detailed error messages
|
|
- Explain what needs to be fixed
|
|
- **STOP**: Do not proceed until build succeeds
|
|
|
|
### If database connection fails:
|
|
- Check if PostgreSQL is running: `pg_isready` or `psql -h localhost -U postgres -c "SELECT 1"`
|
|
- Verify connection string in `DesignTimeDbContextFactory.cs`
|
|
- Check if database exists: `psql -h localhost -U postgres -lqt | cut -d \| -f 1 | grep -qw managing`
|
|
- If database doesn't exist, create it: `createdb -h localhost -U postgres managing`
|
|
- Retry migration creation
|
|
|
|
### If migration conflicts:
|
|
- Check existing migrations: `cd src/Managing.Infrastructure.Database && dotnet ef migrations list --startup-project ../Managing.Api`
|
|
- If migration already exists with same name, suggest a different name
|
|
- If database schema conflicts, suggest reviewing the migration file
|
|
|
|
### If database update fails:
|
|
- Check database state: `psql -h localhost -U postgres -d managing -c "\dt"`
|
|
- Check applied migrations: `psql -h localhost -U postgres -d managing -c "SELECT * FROM \"__EFMigrationsHistory\";"`
|
|
- If migration partially applied, may need to rollback or fix manually
|
|
- Suggest: "Review the error and fix the database state, or rollback the migration"
|
|
|
|
## Example Execution
|
|
|
|
**User input:** `/migration-local`
|
|
|
|
**AI execution:**
|
|
|
|
1. Verify structure: Check `src/Managing.Infrastructure.Database` exists ✅
|
|
2. Build solution: `dotnet build src/Managing.sln` → ✅ Build successful!
|
|
3. Check pending changes: `dotnet ef migrations add --dry-run ...` → ⚠️ Pending changes detected
|
|
4. Generate name: Analyze changes → Suggest "AddBacktestJobsTable"
|
|
5. Confirm name: "Migration name: 'AddBacktestJobsTable'. Proceed? (y/n)" → User confirms
|
|
6. Create migration: `dotnet ef migrations add "AddBacktestJobsTable" ...` → ✅ Migration created
|
|
7. Review file: Show migration file → User confirms
|
|
8. Apply migration: `dotnet ef database update ...` → ✅ Migration applied
|
|
9. Verify status: `dotnet ef migrations list ...` → ✅ Migration verified
|
|
10. Success: "✅ Migration created and applied successfully!"
|
|
|
|
**If build fails:**
|
|
|
|
1-2. Same as above
|
|
3. Build: `dotnet build src/Managing.sln` → ❌ Build failed
|
|
4. Analyze errors: C# compilation error in `JobEntity.cs`
|
|
5. Fix errors: Update type definitions
|
|
6. Re-run build: `dotnet build src/Managing.sln` → ✅ Build successful!
|
|
7. Continue with migration creation
|
|
|
|
**If database connection fails:**
|
|
|
|
1-5. Same as above
|
|
6. Create migration: `dotnet ef migrations add ...` → ❌ Connection failed
|
|
7. Check database: `pg_isready` → Database not running
|
|
8. Inform user: "PostgreSQL is not running. Please start PostgreSQL and try again."
|
|
9. **STOP**: Wait for user to start database
|
|
|
|
## Important Notes
|
|
|
|
- ✅ **Always build before creating migrations** - ensures code compiles correctly
|
|
- ✅ **Review migration file before applying** - verify it matches your intent
|
|
- ✅ **Backup database before applying** - migrations can modify data
|
|
- ✅ **Use descriptive migration names** - helps track schema changes
|
|
- ⚠️ **Migration is applied to local database only** - use other tools for production
|
|
- ⚠️ **Ensure PostgreSQL is running** - connection will fail if database is down
|
|
- 📦 **Database project**: `src/Managing.Infrastructure.Database`
|
|
- 🔧 **Startup project**: `src/Managing.Api`
|
|
- 🗄️ **Local connection**: `Host=localhost;Port=5432;Database=managing;Username=postgres;Password=postgres`
|
|
- 📁 **Migrations folder**: `src/Managing.Infrastructure.Database/Migrations`
|
|
|