8f860a8ec3
- All DLLs now output to lib\[Configuration]\[TargetFramework]\ at repo root (see Directory.Build.props) - .gitignore updated to exclude /lib/ - On first run, startup.json is auto-generated with OS-appropriate default paths (Windows, Linux, macOS, or portable) - Removes null/example config; generated config is immediately usable and clearly documented - Extensive new documentation: build output, startup.json logic, visual guides, and code proofs - Publish profile now deletes existing files for clean deploys - No breaking changes: existing startup.json files are preserved - Improves first-run UX, deployment, and cross-platform consistency
305 lines
7.9 KiB
Markdown
305 lines
7.9 KiB
Markdown
# Troubleshooting: EF Core Pending Model Changes Warning
|
|
|
|
## Issue Description
|
|
|
|
When deploying Jellyfin to a test/production environment, you may encounter this error:
|
|
|
|
```
|
|
System.InvalidOperationException: The model for context 'JellyfinDbContext' has pending changes.
|
|
Add a new migration before updating the database.
|
|
```
|
|
|
|
This error occurs when Entity Framework Core detects that the database model has changed but there isn't a corresponding migration file.
|
|
|
|
## Root Causes
|
|
|
|
### 1. Missing Migration Files (Most Common)
|
|
The development machine has all the migration files, but they weren't deployed to the test/production machine.
|
|
|
|
**Solution**: Ensure all migration files are deployed with your application.
|
|
|
|
#### Check for Migration Files
|
|
|
|
**Location:** `src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/`
|
|
|
|
Files should include:
|
|
- `*.cs` - Migration classes
|
|
- `*.Designer.cs` - Migration metadata
|
|
- `JellyfinDbContextModelSnapshot.cs` - Current model snapshot
|
|
|
|
**Verify on test machine:**
|
|
```bash
|
|
# Check if migration files exist
|
|
ls /opt/pgsql-jellyfin/src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/
|
|
|
|
# Count migration files
|
|
find /opt/pgsql-jellyfin -name "*Migration*.cs" | wc -l
|
|
```
|
|
|
|
### 2. Build Configuration Mismatch
|
|
Migration files might be excluded from the build output.
|
|
|
|
**Solution:** Check your `.csproj` file:
|
|
|
|
```xml
|
|
<ItemGroup>
|
|
<!-- Ensure migrations are included -->
|
|
<Compile Include="Migrations\*.cs" />
|
|
</ItemGroup>
|
|
```
|
|
|
|
### 3. Model Changed Without Migration
|
|
The code has model changes that haven't been captured in a migration.
|
|
|
|
**Solution:** Generate a new migration on your development machine:
|
|
|
|
```bash
|
|
# Navigate to the project directory
|
|
cd src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/
|
|
|
|
# Create a new migration
|
|
dotnet ef migrations add YourMigrationName --context JellyfinDbContext
|
|
|
|
# Rebuild and redeploy
|
|
dotnet build
|
|
```
|
|
|
|
### 4. Different .NET SDK Versions
|
|
Different SDK versions might have different EF Core behaviors.
|
|
|
|
**Solution:** Ensure both machines use the same .NET SDK version:
|
|
|
|
```bash
|
|
# Check version
|
|
dotnet --version
|
|
|
|
# Should be .NET 11 or later
|
|
```
|
|
|
|
## Fix Applied in Code
|
|
|
|
We've suppressed the `PendingModelChangesWarning` in the database provider configuration since we explicitly handle migrations in our startup code:
|
|
|
|
### PostgreSQL Provider
|
|
```csharp
|
|
options
|
|
.UseNpgsql(connectionString, options => /* ... */)
|
|
.ConfigureWarnings(warnings =>
|
|
warnings.Ignore(RelationalEventId.PendingModelChangesWarning));
|
|
```
|
|
|
|
### SQLite Provider
|
|
```csharp
|
|
options
|
|
.UseSqlite(connectionString, options => /* ... */)
|
|
.ConfigureWarnings(warnings =>
|
|
{
|
|
warnings.Ignore(RelationalEventId.NonTransactionalMigrationOperationWarning);
|
|
warnings.Ignore(RelationalEventId.PendingModelChangesWarning);
|
|
});
|
|
```
|
|
|
|
## Verification Steps
|
|
|
|
### 1. Check Logs on Test Machine
|
|
|
|
Look for these log messages:
|
|
|
|
```
|
|
[INF] Checking PostgreSQL database for missing tables...
|
|
[INF] Found X pending migrations: Migration1, Migration2, ...
|
|
[INF] Applying migrations...
|
|
[INF] Successfully applied X migrations
|
|
```
|
|
|
|
If you see warnings:
|
|
```
|
|
[WRN] Model has pending changes. This may indicate missing migration files.
|
|
[WRN] If you're seeing this on a test/production system, ensure all migration files are deployed.
|
|
```
|
|
|
|
### 2. Compare Migration Files
|
|
|
|
**On development machine:**
|
|
```powershell
|
|
# PowerShell
|
|
Get-ChildItem -Path "src\Jellyfin.Database\Jellyfin.Database.Providers.Postgres\Migrations" -Recurse | Select-Object Name
|
|
```
|
|
|
|
**On test machine:**
|
|
```bash
|
|
# Linux
|
|
find /opt/pgsql-jellyfin/src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations -type f
|
|
```
|
|
|
|
The file lists should match!
|
|
|
|
### 3. Verify Deployment
|
|
|
|
Ensure your deployment process includes:
|
|
|
|
1. **All .cs files** in Migrations folder
|
|
2. **All .Designer.cs files** in Migrations folder
|
|
3. **JellyfinDbContextModelSnapshot.cs**
|
|
|
|
## Deployment Checklist
|
|
|
|
### For Manual Deployment
|
|
|
|
- [ ] Build the solution in Release mode
|
|
- [ ] Copy all migration files from dev to test machine
|
|
- [ ] Verify file permissions (migrations must be readable)
|
|
- [ ] Check that the migration assembly is correct
|
|
- [ ] Restart Jellyfin after deploying new files
|
|
|
|
### For Docker/Container Deployment
|
|
|
|
Ensure your `Dockerfile` includes:
|
|
|
|
```dockerfile
|
|
# Copy migration files
|
|
COPY src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/ \
|
|
/app/src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/
|
|
```
|
|
|
|
### For CI/CD Deployment
|
|
|
|
```yaml
|
|
# Example GitHub Actions / GitLab CI
|
|
- name: Build
|
|
run: dotnet build --configuration Release
|
|
|
|
- name: Publish
|
|
run: dotnet publish --configuration Release --no-build
|
|
|
|
# Verify migrations are included
|
|
- name: Verify Migrations
|
|
run: |
|
|
if [ ! -d "publish/Migrations" ]; then
|
|
echo "ERROR: Migration files not found in publish output!"
|
|
exit 1
|
|
fi
|
|
```
|
|
|
|
## Alternative: Database-First Approach (Not Recommended)
|
|
|
|
If you absolutely cannot deploy migration files, you could manually create the database schema, but this is **not recommended** as it bypasses EF Core's migration tracking.
|
|
|
|
## Quick Fix for Immediate Issue
|
|
|
|
If you need an immediate fix on the test machine:
|
|
|
|
### Option 1: Deploy Missing Files (Recommended)
|
|
|
|
1. Copy migration files from development machine to test machine
|
|
2. Restart Jellyfin
|
|
3. Verify migrations are applied
|
|
|
|
### Option 2: Temporarily Skip Migration Check (Not Recommended)
|
|
|
|
You could modify the code to skip the check, but this could lead to database inconsistencies:
|
|
|
|
```csharp
|
|
// In EnsureTablesExistAsync - NOT RECOMMENDED
|
|
if (pendingMigrationsList.Count > 0)
|
|
{
|
|
logger.LogWarning("Skipping {Count} pending migrations", pendingMigrationsList.Count);
|
|
// Don't call MigrateAsync
|
|
}
|
|
```
|
|
|
|
## Prevention
|
|
|
|
### 1. Automated Deployment
|
|
|
|
Use a deployment script that ensures all files are copied:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# deploy.sh
|
|
|
|
SOURCE_DIR="/path/to/dev"
|
|
DEST_DIR="/opt/pgsql-jellyfin"
|
|
|
|
# Stop Jellyfin
|
|
systemctl stop jellyfin
|
|
|
|
# Copy binaries and migrations
|
|
rsync -av --include='*.dll' --include='*.cs' --include='*.Designer.cs' \
|
|
"${SOURCE_DIR}/" "${DEST_DIR}/"
|
|
|
|
# Verify migrations
|
|
if [ ! -f "${DEST_DIR}/src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/JellyfinDbContextModelSnapshot.cs" ]; then
|
|
echo "ERROR: Migration files not found!"
|
|
exit 1
|
|
fi
|
|
|
|
# Start Jellyfin
|
|
systemctl start jellyfin
|
|
```
|
|
|
|
### 2. Continuous Integration
|
|
|
|
Add migration verification to your build pipeline:
|
|
|
|
```yaml
|
|
test:
|
|
script:
|
|
- dotnet build
|
|
- dotnet test
|
|
# Verify migrations compile
|
|
- dotnet ef migrations list --project src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/
|
|
```
|
|
|
|
### 3. Version Control
|
|
|
|
Always commit migration files:
|
|
|
|
```bash
|
|
git add src/Jellyfin.Database/Jellyfin.Database.Providers.Postgres/Migrations/
|
|
git commit -m "Add database migration"
|
|
git push
|
|
```
|
|
|
|
## Related Files Modified
|
|
|
|
To fix this issue, we modified:
|
|
|
|
1. **PostgresDatabaseProvider.cs** - Added warning suppression
|
|
2. **SqliteDatabaseProvider.cs** - Added warning suppression
|
|
3. **Both providers** - Improved error logging and diagnostics
|
|
|
|
## Testing the Fix
|
|
|
|
After applying the code changes:
|
|
|
|
1. **Build the solution:**
|
|
```bash
|
|
dotnet build
|
|
```
|
|
|
|
2. **Deploy to test machine**
|
|
|
|
3. **Check logs:**
|
|
```bash
|
|
journalctl -u jellyfin -f
|
|
# or
|
|
tail -f /var/log/jellyfin/log_*.txt
|
|
```
|
|
|
|
4. **Verify startup:**
|
|
- Should see "Checking PostgreSQL database for missing tables..."
|
|
- Should NOT see "pending changes" error
|
|
- Should see "Successfully applied X migrations" or "No migrations needed"
|
|
|
|
## Summary
|
|
|
|
The error was caused by EF Core's strict validation of model changes. We've:
|
|
|
|
✅ **Suppressed the warning** since we explicitly handle migrations
|
|
✅ **Added better logging** to diagnose issues
|
|
✅ **Improved error messages** to help identify root causes
|
|
✅ **Maintained backward compatibility**
|
|
|
|
The fix ensures that the automatic migration system works correctly without false positives from EF Core's model validation.
|