Files
pgsql-jellyfin/docs/TROUBLESHOOTING_EF_PENDING_CHANGES.md
T
wjones 8f860a8ec3 Centralize build output and generate OS-specific startup.json
- 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
2026-02-26 14:21:26 -05:00

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 metadata
  • JellyfinDbContextModelSnapshot.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:

  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:

# 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

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:

  1. Copy migration files from development machine to test machine
  2. Restart Jellyfin
  3. Verify migrations are applied

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

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:

    dotnet build
    
  2. Deploy to test machine

  3. Check logs:

    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.