Bruno
Bruno

Reputation: 161

EF move migration to new project

I'm refactoring a project and want to move all the EF entities and the code-first migrations to a new project. I renamed the ContextKey in the _Migrations table to the new namespace. When running an Add-Migration, no new changes are detected (Up() and Down() are empty). But when I remove the localdb, the db isn't re-created (it did before the move). Apparently only migrations created after the move are run (but it shouldn't).

How can I make sure all migrations (also the ones before the move) are run when creating a new db?

--edit--

Never mind :(

I dragged and dropped the existing migrations to the new project and renamed the namespaces in the migration.cs files, but forgot the code behind migration.Designer.cs

Upvotes: 3

Views: 3282

Answers (2)

Iman
Iman

Reputation: 18896

You can update all the ContextKey column values in the dbo._MigrationHistory table to match the new namespace and that's all.

For me i was moving all the code first models from ASP.NET MVC app to external Class library to share with other projects.

Below steps may help

  1. check the dbo._MigrationHistory and you can see all records have similar values which match the exact class of Configuration class
MyApp.Migrations.Configuration

2.(test step) run Update-Database from Package Manager Console with new class library selected and you will see for example below error

There is already an object named 'AspNetRoles' in the database.
  1. update all the records in the ContextKey column of _MigrationHistory table to match the new namespace
MyApp.Domain.Migrations.Configuration

Upvotes: 4

Domenico Langone
Domenico Langone

Reputation: 76

The reference table [__MigrationHistory] contains a ContextKey column. Unless otherwise valued, it maintains the value of the membership of DbContext namespace.

You can set a class that derives from dbMigrationsConfiguration and set the ContextKey value in the constructor.

public sealed class Configuration : DbMigrationsConfiguration<Your.Context>
{
   public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
        ContextKey = "PreviousValue";
    }

    protected override void Seed(Your.Context context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
}

Upvotes: 0

Related Questions