Make EF4.3 Code First Migrations ignore pending mi

2019-04-07 22:17发布

I have a local instance of a database that I recently created using DbContext.Database.Create(), so the __MigrationHistory table exists with an InitalCreate entry that matches the code at the moment.

Some code-based migrations exist in the Migrations folder, however. These will be run in our development and staging environments to bring those databases in line with the code. I don't need to apply them locally, however, since I created the database using the current code.

I now need to make a change to the model and create the corresponding migration. But when I run Add-Migration TestMigration, I get the following error

Unable to generate an explicit migration because the following explicit 
migrations are pending: 

[201203271113060_AddTableX, 
 201203290856574_AlterColumnY]

Apply the pending explicit migrations before attempting to generate 
a new explicit migration.

What should I do in this case? I can't point the Add-Migration tool at another environment because it's not guaranteed that version matches what I have locally. I want a migration that matches only the changes I've made.

It seems I have a few options but none are ideal:

  1. Delete the other migrations from the Migrations folder, run the Add-Migration command, upgrade the database, then restore the old migrations. This is simple but seems a bit hackish.
  2. Revert to the version of the model in source control that the first migration was applied to, then build this and use it to create the database. Then get the latest version, apply all the migrations, then I'm ready to add my migration. This seems like a lot of effort!
  3. Create the migration manually.

Does anyone have any suggestions about how to manage this?

5条回答
ゆ 、 Hurt°
2楼-- · 2019-04-07 23:00

simply exclude the old migration file from the solution files.

查看更多
仙女界的扛把子
3楼-- · 2019-04-07 23:02

What I've found works best is very simple: don't use DbContext.Database.Create() once you've enabled migrations. If you want to programmatically create a new database, use the migrations API instead.

var migrator = new DbMigrator(new Configuration());
migrator.Update();

Then you've got the full migration history and adding further migrations works just as expected.

查看更多
一夜七次
4楼-- · 2019-04-07 23:03

I have encountered the same problem. If you run

Update-database

and then run

Add-Migration YourMigrationName

This solves the problem

查看更多
趁早两清
5楼-- · 2019-04-07 23:05

We are planning to use a variant of your Option #1...

Our Standard Operating Procedure is to generate a SQL script for each migration (using the -script option of update-database), in order to have SQL scripts to be applied to end-user "production" databases by InstallShield (we plan to use EF update-database only for developer databases).

Thus, we have both the Migration .cs files and the corresponding .sql files for all migrations in our Migrations folder.

So rather than deleting the migrations from the Migrations folder (as you proposed in #1), we use SQL Mgmt Studio to manually apply just the parts of the .sql files that do the inserts into _MigrationHistory.

That brings the _MigrationHistory of the local database up-to-date with the changes that are already incorporated into that database.

But it's a kludge, and we're still looking for a better solution.

DadCat

查看更多
兄弟一词,经得起流年.
6楼-- · 2019-04-07 23:09

You either need to run "update-database" from the package manager console to push your changes to the database OR you can delete the pending migration file ([201203271113060_AddTableX]) from your Migrations folder and then re-run "add-migration" to create a brand new migration based off of your edits.

查看更多
登录 后发表回答