23

I have added EF 5 to my project via Nuget and enabled migrations with the "Enable-Migrations" command. I have then called "Add-Migration" to generate the base code for generating the schema.

I then added a property to one of my domain objects (string property called "TestProperty") and added a mapping to my EntityTypeConfiguration file (we're ignoring the conventions at the moment).

Calling "Add-Migration" again produces the error:

Unable to generate an explicit migration because the following explicit migrations are pending: [201303262144218_Initial]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

But calling "Update-Database" produces a sql exception because the tables already exist:

There is already an object named 'Customer' in the database

In my constructor for my DbContext I have tried the different update strategies, e.g.:

Database.SetInitializer<UnitOfWork>(new DropCreateDatabaseAlways<UnitOfWork>());

Am I missing something obvious? I tried the solution here but it didn't work: Automatic Migrations for ASP.NET

Thanks

EDIT: Update The key to getting past the first step is to create the initial migration and then delete the generated code from the Up and Down methods (http://thedatafarm.com/blog/data-access/using-ef-migrations-with-an-existing-database/).

I can then update the model and the EF map and then run Add-Migration. This generates a migration with the correct Up and Down code.

The problem is then trying to apply the update. Update-Database produces the error "Unable to update database to match the current model because there are pending changes and automatic migration is disabled...automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration. You can use the Add-Migration command to write the pending model changes to a code-based migration". Ok, so I try Add-Migration again and it produces another migration with the exact same code as the last one.

I run Update-Database and get the same error again. I try "Update-Database -TargetMigration 201304080859556_MyMigration -Force" but this produces "The specified target migration '201304080859556_MyMigration' does not exist. Ensure that target migration refers to an existing migration id" - It does!

Very frustrating!

Community
  • 1
  • 1
SturmUndDrang
  • 1,876
  • 5
  • 27
  • 47
  • Is there an existing file in your Migrations directory called 201303262144218_Initial.cs? – MattSull Mar 27 '13 at 23:04
  • Yes. I'm a little confused - is the initial migration supposed to be blank or is it supposed to create the database in it's initial state? Also, I don't have a __MigrationHistory table (in either my database or Master) – SturmUndDrang Apr 05 '13 at 11:13
  • Initial is just a name given to that particular migration. Sometimes people call their first migration initial. If you had an existing db, and ran the add-migration/update-database command without making any changes to your model classes the migration file would be empty. Delete the file 201303262144218_Initial.cs, and then run the two commands again ('add-migration newestMigration' then 'update-database'. – MattSull Apr 05 '13 at 11:45

7 Answers7

28

I had the same problem enabling EF migrations for a code-first model with an existing database, and the following procedure worked:

  1. Remove the existing Migrations folder in your project, and DROP the table __MigrationHistory from the existing database.
  2. Run the enable-migrations command from the Package Manager Console.
  3. Run the add-migration command to create an initial migration.
  4. Remove all of the code in Up() method for the initial migration.
  5. Run the update-database command to apply the initial migration to your database. This doesn't make any changes to existing objects (because the Up() method contains no code), but it marks the existing database as having been migrated to the initial state.
  6. Make changes to your code-first model.
  7. Run the add-migration command to create a new migration. The code in the Up() method of the new migration will contain only the changes to your object model.
  8. Run the update-database command to apply the changes to your database.
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
MrUpsideDown
  • 638
  • 7
  • 7
  • If i drop the table will i need it in future or it will be created new again? – Nikita Chernykh Jun 10 '15 at 01:00
  • The "__MigrationHistory" table is automatically recreated by EF when you run the "add-migration" command. – MrUpsideDown Jun 15 '15 at 20:19
  • I too found that Visual Studio gets its model change tracking corrupted in some cases (e.g. lots of model and migration changes during refactoring for the best solution), and the only way to fix it is to delete migrationhistory table or manually roll back changes and delete the stuck migrations from migrationhistory table. I find this EF model change tracking to be really annoying sometimes. Laravel has migrations, but no model tracking, and it works just fine. I guess, that's the price for model tracking - additional complexity and issues when you want to fight against EF automatic tracking. – JustAMartin Apr 13 '16 at 14:22
  • Very nice routine MrUpsideDown. In my experience with at least net core version 2.2.104 and for newly created projects, the following apply: enable-migrations can be omitted, the removal of all code within the Up method can be omitted. – netfed Mar 24 '19 at 22:48
10

I run Update-Database and get the same error again. I try "Update-Database -TargetMigration 201304080859556_MyMigration -Force" but this produces "The specified target migration '201304080859556_MyMigration' does not exist. Ensure that target migration refers to an existing migration id" - It does!

There is one more issue which may cause your last error (and maybe it's a root cause of previous ones). I had a similar problem and it turned out that for some strange reason some of my migration classes where in a different namespace than the namespace of my MigrationConfiguration class. Correcting namespaces (also in xxx.Designer.cs files) solved this issue (migrations were visible and working again).

Łukasz Wiatrak
  • 2,747
  • 3
  • 22
  • 38
  • 2
    I ran into almost the exact same issue today (the partial class name in the designer file had been changed, most likely due to a code merge). Once I fixed the designer file, I was able to apply all of my migrations. – DVK Mar 28 '17 at 19:54
  • Try "Update-Database -TargetMigration MyMigration -Force" – gorums Nov 30 '17 at 18:59
  • I was facing this issue because I moved my Migration file and other model stuff to a different project inside the solution. I opened the windows explorer and located to the migration folder then open each files and update the namespace at the top of the migration###.designer.cs to new namespace. any way, Thanx – ebrahim.mr Jun 29 '20 at 11:53
3

Did you try using the -force parameter to apply the changes.

Update-Database [-SourceMigration <String>]
  [-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>]
  [-StartUpProjectName <String>] [-ConfigurationTypeName <String>]
  [-ConnectionStringName <String>] [<CommonParameters>]

-FORCE Specifies that data loss is acceptable during automatic migration of the database.

You can use get-help Update-Database -examples to see usage examples.

Further read: EF Code First Migrations

Matija Grcic
  • 12,963
  • 6
  • 62
  • 90
  • Ok, so I've deleted the initial migration. and run Enable-Migrations (with -Force) which has not created an initial migration. I then ran Add-Migration (specifying the connection string) which has created a migration which creates the entire database (not just the extra property that I added). – SturmUndDrang Apr 05 '13 at 11:18
  • 1
    I then run Update-Database with -FORCE and I get "Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration". Why is it so hard to get this to work? – SturmUndDrang Apr 05 '13 at 11:25
  • I tried the -examples flag also. It just says "NAME Update-Database SYNOPSIS Applies any pending migrations to the database" without giving any examples. – SturmUndDrang Apr 05 '13 at 11:27
2

You do not need to remove the migration manually, remove it conveniently with

Remove-Migration

then you can recreate the migration script again with Add-Migration.

In your case, updating the database failed because there are existing tables, drop them with

Drop-Database

Then you can Update-Database.

More detailed usage of these commands are here.

Chayapol
  • 3,718
  • 1
  • 21
  • 12
1

Trying to migrate an old db version to a new model, either the database didn't match the new model or i got errors like :

Type is not resolved for member 'Npgsql.PostgresException,Npgsql, Version=3.2.2.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7'

Here's how it worked (using automatic migration) :

  1. Delete Migrations folder
  2. Execute enable-migrations
  3. Set this two properties to true in the newly created Configuration.cs

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
    
  4. Execute Update-Database -Force

Your database will be updated to latest scheme and ready.

hope this helps.

Chtioui Malek
  • 11,197
  • 1
  • 72
  • 69
0

This is a blanket approach that usually works:

  1. Delete your entire Migrations folder (make sure that you copy any code that you might have created from the seed method in your migration configuration file).
  2. Delete the actual database. If you are using LocalDb, this will normally sit within your AppData solution folder (Right-click -> open folder location). Make sure to delete the .mdf & .log database files.
  3. Go to Package Manager Console. Enter enable-migrations -projectname yourprojectname
  4. Go to Package Manager Console. Enter add-migration "Initial" -projectname yourprojectname.
  5. Open the migration configuration file and paste the code that you copied from step 1 into the seed method.
  6. Go to Package Manager Console. Enter update-database -projectname yourprojectname

This should do the trick.

0

1) Remove the existing Migrations folder in your project, and delete existing migration from Migration_History table if any.

2)Run the following command from the package manager console:

add-migration reset

3)After that run the following command from the package manager console:

Remove-Migration

4)After that run the following command from the package manager console (InitialMigration is the name of the first migration, you can name as you want ):

add-migration InitialMigration

Abhishek Kanrar
  • 418
  • 4
  • 6