- 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
7.9 KiB
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 metadataJellyfinDbContextModelSnapshot.cs- Current model snapshot
Verify on test machine:
# 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:
<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:
# 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:
# 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
options
.UseNpgsql(connectionString, options => /* ... */)
.ConfigureWarnings(warnings =>
warnings.Ignore(RelationalEventId.PendingModelChangesWarning));
SQLite Provider
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
Get-ChildItem -Path "src\Jellyfin.Database\Jellyfin.Database.Providers.Postgres\Migrations" -Recurse | Select-Object Name
On test machine:
# 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:
- All .cs files in Migrations folder
- All .Designer.cs files in Migrations folder
- 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:
# 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
# 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)
- Copy migration files from development machine to test machine
- Restart Jellyfin
- 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:
// 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:
#!/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:
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:
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:
- PostgresDatabaseProvider.cs - Added warning suppression
- SqliteDatabaseProvider.cs - Added warning suppression
- Both providers - Improved error logging and diagnostics
Testing the Fix
After applying the code changes:
-
Build the solution:
dotnet build -
Deploy to test machine
-
Check logs:
journalctl -u jellyfin -f # or tail -f /var/log/jellyfin/log_*.txt -
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.