I am trying to use migrations with a existing database and to create a new one, if not exists.

The EF Core documentations says:

If you created the initial migration when the database already exists, the database creation code is generated but it doesn't have to run because the database already matches the data model. When you deploy the app to another environment where the database doesn't exist yet, this code will run to create your database

From EFCore docs

I did initial migrations, it creates a up and down methods to create my tables. When I run it to a new database (new database name in connection string) it creates the database and tables as expected.

But if I run it to an existing database (not created by migrations), it fails at the first up method that tries to create a table that already exists, and the migrations stops to run.

Docs says "it doesn't have to run", but first thing migrations is doing is try to create an existing table.

How to prevent migrations to try to create existing tables? There is something like "create if not exists" built in on migrations? Is documentations right? It should works as expected/describe in docs?

If I'm doing it wrong, what is the strategy to work with migrations to run with existing and new on databases?

Dotnet Core version: 1.1. EFCore version: 1.1.2.

Thanks in advance.

8/17/2017 2:30:06 PM

Accepted Answer

You need a baseline migration for the existing database. In EF 6 you used the -IgnoreChanges flag, but that doesn't exist in Core right now. See here.

You can accomplish the same thing in EF Core by commenting out all the Up() code and applying that migration. This will create the __MigrationHistory table and insert a record denoting it has been applied.

Subsequent migrations will be applied to both and if you need to create a new database you are covered.

8/17/2017 6:42:07 PM

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow