Entity Framework  

Entity Framework Core 11 Migrations: Best Practices for Production Deployments

Introduction

Database schema changes are a normal part of application development. As new features are added, developers create new tables, modify existing columns, or update relationships between entities. Managing these changes manually can be error-prone, especially when multiple developers work on the same project.

Entity Framework Core (EF Core) Migrations solve this problem by tracking database schema changes in code and generating the SQL needed to update the database. While migrations simplify development, deploying them to production requires careful planning. A poorly executed migration can lead to downtime, data loss, or application failures.

In this article, you'll learn how EF Core 11 Migrations work, common challenges during production deployments, and the best practices for safely updating production databases.

What Are EF Core Migrations?

EF Core Migrations are a feature that keeps your database schema synchronized with your application's data model.

When you modify an entity class, EF Core can generate a migration that describes the required database changes.

For example, consider the following model:

public class Product
{
    public int Id { get; set; }

    public string Name { get; set; } = string.Empty;
}

Now suppose you add a new property.

public class Product
{
    public int Id { get; set; }

    public string Name { get; set; } = string.Empty;

    public decimal Price { get; set; }
}

EF Core detects the change and creates a migration to add the new Price column.

Creating a Migration

Creating a migration is straightforward using the .NET CLI.

dotnet ef migrations add AddProductPrice

This command creates a migration file containing the schema changes.

To apply the migration, run:

dotnet ef database update

The database is updated to match the current model.

Review Generated Migrations

Although EF Core generates migrations automatically, developers should never apply them without reviewing the generated code.

A migration might contain operations such as:

  • Creating tables

  • Renaming columns

  • Dropping columns

  • Modifying indexes

  • Changing relationships

Reviewing migrations helps identify unintended changes before they reach production.

Generate SQL Scripts for Production

Applying migrations directly from an application startup is convenient during development, but production environments often require greater control.

Instead of updating the database automatically, generate a SQL migration script.

dotnet ef migrations script

This produces a SQL file that can be reviewed, tested, and executed through your organization's deployment process.

Using SQL scripts also allows database administrators to validate changes before deployment.

Test Migrations Before Production

Never apply a migration directly to a production database without testing it first.

A recommended deployment workflow is:

  1. Apply the migration to a local database.

  2. Test it in a staging environment.

  3. Verify application functionality.

  4. Measure query performance.

  5. Deploy to production.

Testing helps identify issues before they affect users.

Avoid Data Loss

Some schema changes can permanently remove data.

For example, deleting a column:

public string Description { get; set; }

Removing this property from the model may generate a migration that drops the corresponding database column.

Before applying such changes:

  • Confirm the data is no longer needed.

  • Back up the database.

  • Consider archiving important information.

  • Review the generated SQL carefully.

Data recovery is much more difficult after a destructive migration has been applied.

Keep Migrations Small

Large migrations that modify many tables at once are harder to review and troubleshoot.

Instead of combining dozens of schema changes into a single migration, create smaller, focused migrations.

For example:

  • Add customer table

  • Add product categories

  • Add order indexes

  • Update audit fields

Smaller migrations are easier to test, deploy, and roll back if necessary.

Manage Database Seeding Carefully

Applications often require initial data such as roles, permissions, or configuration values.

EF Core supports data seeding, but production deployments require careful planning.

Keep seeded data:

  • Small

  • Predictable

  • Repeatable

Avoid inserting large datasets through migrations, as this can increase deployment time and complicate rollback procedures.

Plan for Rollbacks

Not every deployment goes as expected.

Before applying a migration, consider how you would recover if something fails.

Some useful practices include:

  • Create a database backup.

  • Generate rollback scripts when possible.

  • Test rollback procedures in staging.

  • Monitor deployment logs closely.

A rollback plan can significantly reduce downtime during unexpected issues.

Use Source Control for Migrations

Migration files should always be committed to source control along with the related application code.

This provides several benefits:

  • Complete deployment history

  • Easier collaboration

  • Consistent environments

  • Better traceability

  • Simpler code reviews

Avoid manually editing migration history unless absolutely necessary.

Best Practices

When deploying EF Core 11 migrations to production, follow these recommendations:

  • Review every generated migration before applying it.

  • Generate SQL scripts for production deployments.

  • Test migrations in staging before updating production databases.

  • Back up production databases before major schema changes.

  • Keep migrations small and focused on a single change.

  • Avoid destructive operations unless absolutely necessary.

  • Commit migration files to source control.

  • Monitor deployments and verify application functionality after each migration.

  • Coordinate database changes with application deployments to minimize downtime.

Conclusion

Entity Framework Core 11 Migrations provide a reliable way to manage database schema changes throughout the development lifecycle. They simplify version control for databases and help keep your application and database synchronized.

However, successful production deployments require more than simply running a migration command. Careful review, thorough testing, controlled deployment processes, and reliable backup strategies are essential for minimizing risk. By following these best practices, you can deploy database changes with greater confidence while maintaining the stability and reliability of your applications.