Use CreateDatabaseIfNotExists with Code First Migration?
-
30-06-2021 - |
Question
In my project, current approach is to create database if not already exists using CreateDatabaseIfNotExists
and doing seeding initial data from that Intializer
as well. I also added Code First Migration support after upgrade to Entity 4.4, so that in the future when we change the modle/database structure we can update client side database without drop their exist database.
However it didn't seems to working well, for example, I am now stuck on design time where forms wouldn't load and the error message is something like The model backing the 'myEntities' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).
. But the model and database is indeed the updated version, just seems Migration didn't recognize the database generated by CreateDatabaseIfNotExists
, but at the same time all seems working well at run time.
Also after that I noticed that if I let CreateDatabaseIfNotExists
initialize a database, Add-migration
afterwards will fail and complain that pending migration
and ask me to do a update-database
. When I try to do a the update-database
, it will fail as well because the migration path seems assume the database is in initial setup state and will trying to running all the migration scripts while none should be run as the database generated by CreateDatabaseIfNotExists
is indeed sync with current model and should not be migrated at all.
Solution
I discovered that there is a MigrationHistory
table in System Tables, that table will always save the database initialize history regardless of whether the initializer is CreateDatabaseIfNotExists
or MigrateDatabaseToLatestVersion
. The difference is that if database is initialized by CreateDatabaseIfNotExists1, everytime the database initialized, the migriationId for that initialize record will be different, but
MigrateDatabaseToLatestVersion` will always save same set of migrationId for each of the Migration steps. I guess that is how Entity Framework 5.0 works.
So in the end, I give up and rewrite my DB Access code to seeding the initial database data
in other part of my code rather than the CreateDatabaseIfNotExists
or Migrations
Configuration` class because either suit my need.