Consolidating EF migrations into new InitialCreate

南楼画角 提交于 2019-12-02 17:51:34

Consider reading this nice article from Rick Strahl : https://weblog.west-wind.com/posts/2016/jan/13/resetting-entity-framework-migrations-to-a-clean-slate

Basically the solution is not trivial and needs more than just reseting all the migrations into one because you have two scenarios that needs to fit in ONE migration class:

  • Create a new database => the migration class should contain every table creation
  • My database is already up to date => I need an empty migration class

Solution: The idea of this process is basically this: The database and the EF schema are up to date and just the way you want it, so we are going to remove the existing migrations and create a new initial migration.

In summary, the steps to do this are:

  • Remove the _MigrationHistory table from the Database
  • Remove the individual migration files in your project's Migrations folder
  • Enable-Migrations in Package Manager Console
  • Add-migration Initial in PMC
  • Comment out the code inside of the Up method in the Initial Migration
  • Update-database in PMC (does nothing but creates Migration Entry) Remove comments in the Initial method You've now essentially reset the schema to the latest version.
  • once the commented out migration has been executed on the desired database, uncomment the migration code

If you're not concerned with keeping this migrations, what I've done is delete everything in your migrations folder, and then target a new database in the connection string (or pass in a new one). After that, you can just run the add-migration command:

add-migration InitialCreate

And it should create the migration for you.

Below procedure has the benefit of working without doing anything with the DBs, __MigrationHistory can stay as-is. Also it will work if you have multiple different environments with different versions of the structure - provided you have the branches to match.

I turn the last migration into an initial migration. The trick is to use the oldest version of the code and DB that is in use, replace its last migration with a new initial migration and delete all previous migrations. Newer branches keep the more recent migrations so those will still work after merging to older branches.

So start in the OLDEST branch - PROD, normally - and do:

  1. Remove all but the last migration
  2. Remove the migration code in both the "Up" and "Down" methods in the last migration
  3. Change build action of the last migration to "None" to let EF ignore it
  4. Change active connection to point to a local DB database.
  5. Make sure this local DB database does not exist
  6. add-migration Initial
  7. Copy Up and Down code from the created "Initial" migration to the last migration
  8. Delete Initial migration
  9. Change build action of the last migration back to "Compile"
  10. Check in
  11. Merge changes up
  12. Test in DEV branch on LocalDB DB - it should do the new initial migration as well as the subsequent ones with no issues
  13. Test in main branch on the latest DB - it shouldn't do anything

Note above only works if you don't add stuff to the migrations that EF doesn't do itself. E.g. if you add DB views etc. than the newly created migration won't get those, it only gets the scripts EF generates based on your code.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!