Entity Framework Migrations
Entity Framework (EF) Migrations is a feature that enables you to manage incremental changes to your data model and database schema over time. It allows you to evolve your database schema safely and efficiently as your application's data requirements change.
On This Page
Introduction to Migrations
When you're developing an application using Entity Framework, your C# or VB.NET code defines your data model. As your application evolves, you'll likely need to make changes to this model, such as adding new entities, removing properties, or changing data types. EF Migrations provides a way to translate these model changes into corresponding database schema updates.
EF Migrations works by generating C# code files that represent specific schema changes. These files are called "migration" files. Each migration file typically contains two methods: Up()
, which applies the change to the database, and Down()
, which reverts the change.
Enabling Migrations
Before you can use Migrations, you need to enable it for your EF DbContext. This is typically done using a Package Manager Console command.
PM> Enable-Migrations
This command creates a Migrations
folder in your project, which will contain your migration files and a configuration file (Configuration.cs
).
dotnet ef migrations add InitialCreate
.
Creating Migrations
Once Migrations is enabled, you can create a new migration file by running the Add-Migration
command in the Package Manager Console. This command analyzes your current data model and compares it to the last applied migration to detect any changes.
For example, to create an initial migration after enabling Migrations:
PM> Add-Migration InitialCreate
If you make changes to your model (e.g., add a new property to an existing entity), you would run the command again to generate a new migration:
PM> Add-Migration AddUserEmailProperty
EF will automatically generate the C# code to add the new property to your database table.
Example of a Generated Migration File:
using System.Data.Entity.Migrations;
namespace YourProject.Migrations
{
public partial class AddUserEmailProperty : DbMigration
{
public override void Up()
{
AddColumn("dbo.Users", "Email", c => c.String());
}
public override void Down()
{
DropColumn("dbo.Users", "Email");
}
}
}
Applying Migrations
After creating migration files, you need to apply them to your database. The Update-Database
command in the Package Manager Console handles this.
To apply all pending migrations:
PM> Update-Database
To apply a specific migration:
PM> Update-Database -TargetMigration "AddUserEmailProperty"
EF will execute the Up()
method of each migration that hasn't been applied yet, updating your database schema accordingly.
automaticMigrationsEnabled
property to true
in your Configuration.cs
file to have EF automatically apply migrations on application startup. Use this with caution in production environments.
Reverting Migrations
Sometimes, you may need to undo a migration. The Update-Database
command can also be used to revert migrations.
To revert the last applied migration:
PM> Update-Database -TargetMigration "0"
(Where "0" represents the initial state before any migrations).
To revert to a specific previous migration:
PM> Update-Database -TargetMigration "InitialCreate"
This will execute the Down()
method for all migrations applied after the specified target migration.
Custom Migrations
For operations that EF's automatic migration generation doesn't cover (e.g., creating stored procedures, seeding initial data, or performing complex data transformations), you can write custom migration code.
You can write raw SQL statements within the Up()
and Down()
methods:
using System.Data.Entity.Migrations;
namespace YourProject.Migrations
{
public partial class AddUserRoleProcedure : DbMigration
{
public override void Up()
{
Sql(@"
CREATE PROCEDURE usp_GetUserByEmail
@Email NVARCHAR(100)
AS
BEGIN
SELECT * FROM Users WHERE Email = @Email;
END
");
}
public override void Down()
{
Sql(@"DROP PROCEDURE usp_GetUserByEmail");
}
}
}
You can also create custom migration classes that inherit from DbMigration
and implement specific database operations using EF's fluent API or ADO.NET.
Best Practices
- Always review generated migrations: Before applying a migration, carefully inspect the generated code to ensure it matches your intentions.
- Keep migrations small and focused: Each migration should represent a single, logical change to the schema.
- Use descriptive migration names: This makes it easier to understand the purpose of each migration.
- Test migrations thoroughly: Always test migrations in a development or staging environment before deploying to production.
- Avoid dropping columns or tables in production migrations if possible: This can lead to data loss. Consider marking columns as nullable or renaming them instead.
- Use
Down()
methods for rollback: Ensure yourDown()
methods correctly reverse the changes made in theUp()
method. - Seed initial data carefully: Use the
Seed()
method in yourConfiguration.cs
file for initial data population.
Conceptual Entity-Relationship Diagram (Illustrative)

This diagram is a simplified representation. Actual database schemas may vary.
EF Migrations is a powerful tool for managing your database schema evolution in a structured and controlled manner, especially when working with the Code-First approach.